调整ggplot中的置信区间,同时保持默认的绘图边距缓冲区

时间:2016-02-22 18:51:40

标签: r ggplot2

为了数据访问,让我们使用内置的JohnsonJohnson数据集:

dat <- JohnsonJohnson
df <- data.frame(date = time(dat), Y = as.matrix(dat))

现在以99%置信区间绘制时间序列:

p1 <- ggplot(df, aes(date, Y)) +
        geom_point() +
        geom_smooth(level = 0.99) +
        theme_bw()

enter image description here

这接近我想要的,除了让置信区间低于零是没有意义的。

建议的补救措施是使用coord_cartesian()设置绘图区域的限制,如下所示:

max <- ggplot_build(p1)$panel$ranges[[1]]$y.range[2]
p2 <- p1 + coord_cartesian(ylim = c(0, max))

enter image description here

但是,我不希望绘图边距的最小值为y = 0.我喜欢使用空间的默认缓冲区将最极端值与所有四边的绘图边距边缘分开。您可以在p1(添加coord_cartesian()参数之前的图表)中看到这一点,但只能在p2中的三个方面看到。

所以简而言之,我想保持置信区间在y = 0(如coord_cartesian()所做)的地方变平,而不删除任何基础数据(如scale_y_continuous()那样),但是保持p1具有的默认绘图边距缓冲区。

如果知道有用,默认绘图范围比每个维度的绘图对象范围(即所有点的最大范围和置信区间)大10%。

1 个答案:

答案 0 :(得分:3)

这是一个通过编辑用于绘制置信区间的数据的解决方案(提取数据的方法来自Drawing only boundaries of stat_smooth in ggplot2

首先,我们创建正常情节:

p1 <- ggplot(df, aes(date, Y)) +
  geom_point() +
  geom_smooth(level = 0.99) +
  theme_bw()

然后,我们提取更平滑的数据并编辑ymin-variable

smooth_data <- ggplot_build(p1)$data[[2]]
smooth_data$ymin[smooth_data$ymin<0] <- 0

然后,我们使用这些数据创建一个新的图:

p2 <- ggplot(df,aes(date, Y) )+
  geom_point() +
  geom_smooth(se=F)+
  geom_ribbon(data=smooth_data, aes(x=x,ymin=ymin,ymax=ymax),col="grey60",alpha=0.4,inherit.aes=F) +
  theme_bw()

enter image description here