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

cha*_*low 6 r function ggplot2 dataframe

我是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))
Run Code Online (Sandbox Code Playgroud)

我想为曲线的特定区域着色,因此使用Internet创建了如下函数:

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

然后用 p + stat_function(fun = funcShaded, geom="area", fill="#84CA72", alpha=.2)

这可以创建我想要的图形。但是,我对此有2个问题。首先,当我分解代码时

data.frame(x = c(300, 2700))
Run Code Online (Sandbox Code Playgroud)

如您所料,创建了一个两个项目的数据框,因此如何将其用于创建x轴值,并进一步传递给要适当使用的函数(读取它,就像它是值列表一样)?

其次,我现在想稍后再使用此函数,以根据不同的分数(例如score2 = 1630)填充曲线下的其他区域,并认为我可以添加另一个变量funcShaded以传递分数(即funcShaded <- function(x, score))然后stat_function按如下方式调用我的函数:p + stat_function(fun = funcShaded(x, score2), ...)但:

  1. 我不确定此语法是否可以使用
  2. 似乎x从未使用此代码明确“创建” 该变量,因为它没有显示在我的环境中,并且当我尝试该代码时出现错误:找不到对象“ x”

因此,我想我很好奇“ x”在这种情况下的工作方式,以及我是否应该根据自己的意愿以不同的方式创建它。

ali*_*ire 10

传递给该函数的函数stat_function必须是未调用的(除非它返回另一个函数;类似adverb之类的副词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))
Run Code Online (Sandbox Code Playgroud)

另外,您无需编写自己的函数,也可以使用stat_functionxlim参数执行相同的操作:

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))
Run Code Online (Sandbox Code Playgroud)

至于如何stat_function使用传递到x美学中的值,它使用它们作为在值网格之间进行插值的极限,值网格的数量由其n参数设置,默认为101。这与大多数方法肯定是不同的用法stats,但这是一个非常有用的功能。