如何将stat_ecdf与geom_ribbon结合起来?

时间:2013-11-29 02:55:46

标签: r plot 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

我可以使用

生成variable的ECDF
library("ggplot2")
ggplot(dat, aes(x = variable)) +
    geom_step(stat = "ecdf")

但是,我无法使用lowerupper作为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图的替代方法?

2 个答案:

答案 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()可让您从绘图中获取生成的数据,然后您可以覆盖您喜欢的内容。

此图表显示:

  • red =原创彩带
  • blue =采用原始CI矢量并应用于ecdf曲线
  • green =计算上下系列的ecdf和图

enter image description here

    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")