如何将stat_ecdf与geom_ribbon结合起来?

Rei*_*son 6 plot r ggplot2

我试图绘制一些数据的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作为yminymax美学的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图定义的阴影多边形lowerupper作为图层的阴影多边形吗?

jor*_*ran 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")
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)