我试图绘制一些数据的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
Run Code Online (Sandbox Code Playgroud)
我能够生产出variable使用的ECDF
library("ggplot2")
ggplot(dat, aes(x = variable)) +
geom_step(stat = "ecdf")
Run Code Online (Sandbox Code Playgroud)
但是我无法使用lower,并upper作为ymin与ymax美学的geom_ribbon()叠加对剧情另一层的置信区间.我试过了:
ggplot(dat, aes(x = variable)) +
geom_ribbon(aes(ymin = lower, ymax = upper), stat = "ecdf") +
geom_step(stat = "ecdf")
Run Code Online (Sandbox Code Playgroud)
但这会引发以下错误
Error: geom_ribbon requires the following missing aesthetics: ymin, ymax
Run Code Online (Sandbox Code Playgroud)
有没有办法来哄geom_ribbon()与合作stat_ecdf()产生阴影的置信区间?或者,任何人都可以建议另一种方法来添加由ECDF图定义的阴影多边形lower和upper作为图层的阴影多边形吗?
试试这个(在黑暗中拍摄的一些照片):
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")
Run Code Online (Sandbox Code Playgroud)
好吧,这与您尝试做的事情不同,但它应该解释发生了什么。返回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)
Run Code Online (Sandbox Code Playgroud)