我正在尝试绘制一些数据的ECDF,其中“置信区间”使用 ggplot2 通过阴影区域表示。我无法将geom_ribbon()
与stat_ecdf()
结合起来,以达到我想要的效果。
考虑以下示例数据:
set.seed(1)
dat <- data.frame(variable = rlnorm(100) + 2)
dat <- transform(dat, lower = variable - 2, upper = variable + 2)
> head(dat)
variable lower upper
1 2.534484 0.5344838 4.534484
2 3.201587 1.2015872 5.201587
3 2.433602 0.4336018 4.433602
4 6.929713 4.9297132 8.929713
5 3.390284 1.3902836 5.390284
6 2.440225 0.4402254 4.440225
我可以使用
生成variable
的ECDF
library("ggplot2")
ggplot(dat, aes(x = variable)) +
geom_step(stat = "ecdf")
但是,我无法使用lower
和upper
作为ymin
的{{1}}和ymax
美学,将信心区间叠加在另一个地图上层。我试过了:
geom_ribbon()
但这会引发以下错误
ggplot(dat, aes(x = variable)) +
geom_ribbon(aes(ymin = lower, ymax = upper), stat = "ecdf") +
geom_step(stat = "ecdf")
有没有办法诱使Error: geom_ribbon requires the following missing aesthetics: ymin, ymax
使用geom_ribbon()
来产生阴影置信区间?或者,是否有人可以建议将stat_ecdf()
和lower
定义的阴影多边形添加为ECDF图的替代方法?
答案 0 :(得分:3)
试试这个(在黑暗中拍摄一下):
ggplot(dat, aes(x = variable)) +
geom_ribbon(aes(x = variable,ymin = ..y..-2,ymax = ..y..+2), stat = "ecdf",alpha=0.2) +
geom_step(stat = "ecdf")
好的,这与你想做的事情不一样,但它应该解释发生了什么。 stat
正在返回一个只包含原始x和计算y的数据框,所以我认为这就是你必须要处理的所有内容。即stat_ecdf
仅计算一次x的累积分布函数。
我能想到的唯一另一件事是显而易见的,分别计算下部和上部,这样的事情:
l <- ecdf(dat$lower)
u <- ecdf(dat$upper)
v <- ecdf(dat$variable)
dat$lower1 <- l(dat$variable)
dat$upper1 <- u(dat$variable)
dat$variable1 <- v(dat$variable)
ggplot(dat,aes(x = variable)) +
geom_step(aes(y = variable1)) +
geom_ribbon(aes(ymin = upper1,ymax = lower1),alpha = 0.2)
答案 1 :(得分:2)
不确定您想要如何反映CI,但ggplot_build()
可让您从绘图中获取生成的数据,然后您可以覆盖您喜欢的内容。
此图表显示:
g<-ggplot(dat, aes(x = variable)) +
geom_step(stat = "ecdf") +
geom_ribbon(aes(ymin = lower, ymax = upper), alpha=0.5, fill="red")
inside<-ggplot_build(g)
matched<-merge(inside$data[[1]],data.frame(x=dat$variable,dat$lower,dat$upper),by=("x"))
g +
geom_ribbon(data=matched, aes(x = x,
ymin = y + dat.upper-x,
ymax = y - x + dat.lower),
alpha=0.5, fill="blue") +
geom_ribbon(data=matched, aes(x = x,
ymin = ecdf(dat.lower)(x),
ymax = ecdf(dat.upper)(x)),
alpha=0.5, fill="green")