如何在ggplot点图底部添加横跨整个x轴的指定y值长条
实现方法
你可以通过annotate()函数直接添加横跨全x轴的矩形长条,无需额外构造数据集,适配性强。
基础实现(手动适配x轴范围)
由于你的x轴是分类变量,3个分类对应的底层坐标为1、2、3,因此将矩形的x范围设为0.5到3.5即可刚好覆盖整个x轴,你可以自定义长条的位置、高度、样式:
library(ggplot2) d=data.frame(drink=c("coffee","tea","water"), mean=c(5,6,9), lower=c(4.5,5.6,8.7), upper=c(5.5,6.3,9.5)) ggplot() + # 底部长条放在最前,保证在图表最底层不会遮挡上层元素 annotate("rect", xmin = 0.5, xmax = 3.5, # 覆盖3个分类的全x轴范围 ymin = 0.6, ymax = 1.4, # 固定y轴位置,可按需调整高度 fill = "gray80", color = NA, alpha = 0.8) + # 自定义样式 geom_errorbar(data=d, mapping=aes(x=drink, ymin=upper, ymax=lower), width=0.2, size=1, color="blue") + geom_point(data=d, mapping=aes(x=drink, y=mean), size=4, shape=21, fill="white") + scale_y_continuous(n.breaks = 10) + ylim(0, 12)
进阶实现(自动适配x轴范围)
如果x轴分类数量经常变动,可通过自动读取x轴范围的方式适配,无需手动修改x参数:
library(ggplot2) d=data.frame(drink=c("coffee","tea","water"), mean=c(5,6,9), lower=c(4.5,5.6,8.7), upper=c(5.5,6.3,9.5)) # 先绘制基础图层 p <- ggplot() + geom_errorbar(data=d, mapping=aes(x=drink, ymin=upper, ymax=lower), width=0.2, size=1, color="blue") + geom_point(data=d, mapping=aes(x=drink, y=mean), size=4, shape=21, fill="white") + scale_y_continuous(n.breaks = 10) + ylim(0, 12) # 自动获取x轴范围添加长条 x_range <- layer_scales(p)$x$range$range p + annotate("rect", xmin = x_range[1] - 0.5, xmax = x_range[2] + 0.5, ymin = 0.6, ymax = 1.4, fill = "gray80", color = NA, alpha = 0.8)
内容的提问来源于stack exchange,提问作者neuron
相关产品推荐
相关产品推荐

