【问题标题】:Using stat_function to draw partially shaded normal curve in ggplot2使用 stat_function 在 ggplot2 中绘制部分阴影正态曲线
【发布时间】:2018-07-23 00:12:24
【问题描述】:

我是 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))

我想对曲线的特定区域进行着色,因此我使用互联网创建了如下函数:

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),我想我可以在funcShaded 中添加另一个变量来通过分数(即funcShaded &lt;- function(x, score)) 然后调用我的stat_function 如下:p + stat_function(fun = funcShaded(x, score2), ...) 但是:

  1. 我不确定这种语法是否有效
  2. 似乎x 变量从未使用此代码显式“创建”,因为它没有显示在我的环境中,当我尝试此代码时,我得到错误:找不到对象'x'

所以我想我只是好奇 'x' 在这种情况下是如何工作的,以及我是否应该根据我想要做的不同来创建它。

【问题讨论】:

    标签: r function dataframe ggplot2


    【解决方案1】:

    传递给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_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))
    

    至于 stat_function 如何使用传递给其 x 美学的值,它使用它们作为在其间插入值网格的限制,其数量由其 n 参数设置,默认为 101 . 与大多数stats 的用法显然不同,但它是一个非常有用的功能。

    【讨论】:

    • 这很有趣!而且完全不是我习惯的。内插的“x”是否仅在线路呼叫期间存在然后消失?最初我将我的第一个ggplot 调用设置为变量p,我可以看到p$data 中有x 数据框,但仍然没有我可以看到的插值x。进一步感谢您的解释。很有帮助!
    • 如果您查看文档,它有两个计算变量xy,可以访问它们,因此您可以执行ggplot(data.frame(x = c(-3, 3))) + stat_function(aes(x, -..y..), fun = dnorm) 之类的操作。不过,使用计算变量可能会变得非常挑剔。
    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2017-06-19
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多