如何在 ggplot2 中使用 geom_ribbon 为 geom_hline 制作错误栏?

Posted

技术标签:

【中文标题】如何在 ggplot2 中使用 geom_ribbon 为 geom_hline 制作错误栏?【英文标题】:How do i make an errorbar for a geom_hline using geom_ribbon in ggplot2? 【发布时间】:2017-04-17 21:57:11 【问题描述】:

我想为我的 geom_hline 设置一个错误栏,并认为带有不透明度的 geom_ribbon 看起来最好。但我不知道如何让它到达情节的尽头。我希望 geom_ribbon 像 geom_hline 那样接触绘图的两侧。下面是示例代码:

library('ggplot2')

x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(1,2,3,4,5,6,7,8,9,10)

data <- data.frame(x,y)

p1 <- ggplot(data,aes(x = x, y = y)) + geom_line() + geom_hline(yintercept=5)

p1 + geom_ribbon(aes(y = y[5],ymin = y[5]-0.5, ymax = y[5]+0.5, fill = 'red'), alpha = 0.4) 

【问题讨论】:

【参考方案1】:

在 geom_hline() 中没有办法设置 xlim,而是水平线从绘图的一端延伸到另一端。您可以使用 geom_segment 代替,它允许您通过指定线段的起始坐标(x,y)和结束坐标(xend,yend)来控制线的 x 范围和 y 范围

这行得通:

library('ggplot2')

x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(1,2,3,4,5,6,7,8,9,10)

data <- data.frame(x,y)

p1 <- ggplot(data, aes(x = x, y = y)) + geom_line() + geom_segment(aes(x = x[1], xend = x[10], y = y[5], yend = y[5]))

p1 + geom_ribbon(aes(y = y[5],ymin = y[5]-0.5, ymax = y[5]+0.5, fill = 'red'), alpha = 0.4) 

【讨论】:

这行得通,但不能回答问题:“我希望 geom_ribbon 像 geom_hline 那样接触绘图的两侧。”【参考方案2】:

几个选项:

1) 像这样使用geom_hline 而不是geom_ribbon(可能是最佳选择):

p1 + geom_hline(yintercept = y[5], color = 'red', size = 8, alpha = 0.4)

2) 像这样添加scale_x_continuous(expand=c(0,0)) 删除绘图区域和轴之间的区域(归功于https://***.com/a/22945857/5727278):

p1 + geom_ribbon(aes(y = y[5],ymin = y[5]-0.5, ymax = y[5]+0.5, fill = 'red'), alpha = 0.4) +
scale_x_continuous(expand=c(0,0))

【讨论】:

您好,感谢您的回答!我最喜欢选项 1,但问题是 8 的线大小不等于 y±0.4。问题是(我想当我环顾四周时)大小参数在 inceh 中,并且在除以 1/0.352777778 时似乎是固定的似乎有效! CREDIT TO: http://***.com/questions/17311917/ggplot2-the-unit-of-siz 是的,第一个选项是不稳定的。并且会随着情节的缩放而改变。 我知道这已经很老了,但正如指出的第一个选项是不稳定的。据我所知,第二个答案仅在您只处理线条时才有效。如果您正在绘制点并且想要添加一条水平线和相关的功能区,则设置 expand = c(0,0) 基本上会导致绘图的边界在任一极端处截断您的点。【参考方案3】:

使用带有无限 x 值的 annotate

ggplot(data, aes(x, y)) + 
  geom_line() + 
  geom_hline(yintercept = 5) +
  annotate('ribbon', x = c(-Inf, Inf), ymin = 5 - 0.5, ymax = 5 + 0.5, 
           alpha = 0.4, fill = 'red')

如果需要图例,直接使用geom_ribbon,如下所示:

ggplot(data, aes(x, y)) + 
  geom_line() + 
  geom_hline(yintercept = 5) +
  geom_ribbon(
    aes(x, y = NULL, ymin = ymin, ymax = ymax, fill = 'my_label'), 
    data.frame(x = c(-Inf, Inf), ymin = 5 - 0.5, ymax = 5 + 0.5),
    alpha = 0.4
  )

【讨论】:

如果你这样做,我不相信你可以轻松地将它添加到你的图例中 @user2017023,是的,但我认为 OP 错误地得到了他们的图例(即他们打算在 aes 之外使用 fill = 'red',否则标记它是没有意义的 'red')。要获得图例,您可以直接使用geom_ribbon。我已将其添加到答案中。 太完美了。感谢您在 3 年后回复我的评论 - 我很感激!

以上是关于如何在 ggplot2 中使用 geom_ribbon 为 geom_hline 制作错误栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在闪亮中使用 ggplot2 绘制数据框的子集

在 ggplot2 中,使用两种图形类型时如何缩放图例?

如何在 ggplot2 中正确绘制投影网格数据?

如何在ggplot2中移动或定位图例

如何在ggplot2中更改散点图的颜色

如何在 Ggplot2 标签中使用“符号 = 数字”和“字符 = 数字”