使用stat_function在ggplot2中绘制部分阴影的正常曲线

时间:2018-02-12 18:20:23

标签: r function dataframe ggplot2

我是R中的一个重要的初学者,我很困惑ggplot在创建普通曲线时如何使用变量“x”。

我的情况是这样的。我试图在给定特定方法和标准偏差的情况下绘制正态曲线,并且在没有数据的情况下,我看到的最常见的方法如下:

score = 1800
m = 1500
std = 300

ggplot(data.frame(x = c(300, 2700)), aes(x = x)) + stat_function(fun = 
     dnorm, args = list(mean = m, sd = std)) + scale_x_continuous(name 
     = "Score", breaks = seq(300, 2700, std))

我想要对曲线的特定区域进行着色,以便使用Internet创建一个函数,如下所示:

funcShaded <- function(x) {
    y = dnorm(x, mean = m, sd = std)
    y[x < score] <- NA
    return(y)
}

然后在我的曲线上添加了一个图层 p + stat_function(fun = funcShaded, geom="area", fill="#84CA72", alpha=.2)

这可以创建我想要的图形。但是,我有两个问题。首先,当我打破代码时

data.frame(x = c(300, 2700))

创建一个两项数据框,正如您所期望的那样,它如何能够用于创建x轴值,并进一步传递给要正确使用的函数(读取。就好像它是一个列表值)?

其次,我现在想要稍后重新使用此功能,根据不同的分数(例如score2 = 1630)填充曲线下的其他区域,并且我想我可以将另一个变量添加到{{1} }通过分数(即funcShaded然后按以下方式调用我的funcShaded <- function(x, score))stat_function但是:

  1. 我不确定这种语法是否有效
  2. 似乎p + stat_function(fun = funcShaded(x, score2), ...)变量从未使用此代码显式“创建”,因为它不会显示在我的环境中,当我尝试此代码时,我得到错误:对象'x'不是结果
  3. 所以我想我只是好奇'x'在这种情况下是如何工作的,如果我应该按照我想要的方式创造它。

1 个答案:

答案 0 :(得分:4)

传递给stat_function的函数必须是未调用的(除非它返回另一个函数;像purrr::partial这样的副词是另一种方法),因为stat_function需要传递它x值的向量。

您已使用dnorm完成了funcShaded所需的操作:通过args传递其他固定参数:

library(ggplot2)

score = 1800
m = 1500
std = 300

funcShaded <- function(x, lower_bound) {
    y = dnorm(x, mean = m, sd = std)
    y[x < lower_bound] <- NA
    return(y)
}

ggplot(data.frame(x = c(300, 2700)), aes(x = x)) + 
    stat_function(fun = dnorm, args = list(mean = m, sd = std)) + 
    stat_function(fun = funcShaded, args = list(lower_bound = score), 
                  geom = "area", fill = "#84CA72", alpha = .2) +
    scale_x_continuous(name = "Score", breaks = seq(300, 2700, std))

或者,如果不编写自己的函数,您可以使用stat_function的{​​{1}}参数执行相同的操作:

xlim

至于ggplot(data.frame(x = c(300, 2700)), aes(x = x)) + stat_function(fun = dnorm, args = list(mean = m, sd = std)) + stat_function(fun = dnorm, args = list(mean = m, sd = std), xlim = c(score, 2700), geom = "area", fill = "#84CA72", alpha = .2) + scale_x_continuous(name = "Score", breaks = seq(300, 2700, std)) 如何使用传递到其stat_function美学中的值,它将它们用作插值值网格的限制,其值由x设置参数,默认为101.它绝对是一个与大多数n不同的用法,但它是一个非常有用的功能。