我想设计一个geom来绘制一条围绕它的置信区间的线。这将基于的数据框包含以下内容:
例如,
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;的变量?
答案 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"