为行和置信区间创建ggplot2 geom

时间:2015-09-16 18:15:28

标签: r ggplot2

我想设计一个geom来绘制一条围绕它的置信区间的线。这将基于的数据框包含以下内容:

  1. x值
  2. 每个x值的主线的y值
  3. 每个x的标准误差y = f(x)
  4. 例如,

    xvals <- seq(0,2*pi,length=100)
    df <- data.frame(x=xvals, y=sin(xvals), se=.25)
    head(df)
         x           y   se
    1 0.00 0.000000000 0.25
    2 0.01 0.009999833 0.25
    3 0.02 0.019998667 0.25
    4 0.03 0.029995500 0.25
    5 0.04 0.039989334 0.25
    6 0.05 0.049979169 0.25
    

    我按照here列出的指南编写了以下几何函数:

    geom_myci <- function(yvar, sevar) {
      list(geom_ribbon(mapping=aes_q(ymin=substitute(yvar-1.96*sevar),
                                     ymax=substitute(yvar+1.96*sevar)),
                       colour="lightgrey", fill="lightgrey"),
           geom_line(mapping=aes_q(y=substitute(yvar)), lwd=2),
           theme_bw())
    }
    

    然后可以使用以下方法执行:

    ggplot(df, aes(x,y)) + geom_myci(y,se)
    

    这很好用,我唯一不喜欢的是让用户输入y变量两次。在geom函数中,有没有办法知道已经映射到&#34; y&#34;的变量?

1 个答案:

答案 0 :(得分:1)

您可以通过aes_string与{em> se - 变量的substitute执行此操作,如下所示 - 请查看http://adv-r.had.co.nz/Functions.html以了解{{1}和惰性评估工作

substitute

geom_myci <- function(se_var = se) { se_var <- as.character(substitute(se_var)) list(geom_ribbon(aes_string(ymin = sprintf("y - 1.96 * %s", se_var), ymax = sprintf("y + 1.96 * %s", se_var)), colour="lightgrey", fill="lightgrey"), geom_line(lwd=2), theme_bw()) } as.character(substitute(se_var))成为刺痛。在此示例中se_var。现在,您可以使用它来通过"se"构建aes_string,从而产生
sprintf("y - 1.96 * %s", se_var) - 我们需要的字符串。

中绘制结果(按要求)
"y - 1.96 * se"

enter image description here