ggplot2中如何让带对照组的柱状图误差线居中且宽度一致?
解决ggplot2中对照组误差线宽度异常的问题
问题描述
我有一份数据集,用于比较两种线虫(A、B)来自两个来源(实验室培育、商业)的感染情况,同时包含未处理对照组。想要绘制带误差线的柱状图,对比四个处理组与对照组,但误差线的表现始终不符合预期。
可运行示例代码如下:
require(dplyr) require(ggplot2) set.seed(1234) # create data data.frame(source=c("Control",rep(c("Lab","Commercial"),2)), species=c("Control","A","A","B","B"), means=abs(rnorm(5,10,5)), ses=abs(rnorm(5,1,3)))%>% # plot the data ggplot(aes(x=species, y=means, ymin=means-ses, ymax=means+ses, fill=source))->p1 # option 1 p1+ geom_col(position=position_dodge(preserve="single"))+ geom_errorbar(width=0.4, position=position_dodge(width=0.9)) # option 2 p1+ geom_col(position=position_dodge2(preserve="single"))+ geom_errorbar(width=0.4, position=position_dodge2(width=0.9)) # option 3 p1+ geom_col(position=position_dodge2(preserve="single"))+ geom_errorbar(width=0.4, position=position_dodge(width=0.9)) # option 4 p1+ geom_col(position=position_dodge(preserve="single"))+ geom_errorbar(width=0.4, position=position_dodge2(width=0.9))
上述代码生成四种图形,其中Option3最接近预期,但对照组的误差线宽度过宽。使用preserve="single"保持所有柱子宽度一致,参考之前的问题设置了position_dodge(width=0.9),但无论如何调整,对照组的误差线似乎都忽略了width=0.4参数。
问题原因与解决方案
原因
position_dodge()在处理只有单个分组的x类别(比如这里的Control)时,会将误差线的宽度拉伸至该x位置的整个可用宽度,导致它看起来比其他组的误差线宽很多。而position_dodge2()针对这种单分组情况有专门的padding参数,可以控制元素的左右留白,避免宽度异常。
修改后的代码
require(dplyr) require(ggplot2) set.seed(1234) data.frame(source=c("Control",rep(c("Lab","Commercial"),2)), species=c("Control","A","A","B","B"), means=abs(rnorm(5,10,5)), ses=abs(rnorm(5,1,3)))%>% ggplot(aes(x=species, y=means, ymin=means-ses, ymax=means+ses, fill=source)) + geom_col(position = position_dodge2(preserve = "single")) + geom_errorbar(width = 0.4, position = position_dodge2(preserve = "single", padding = 0.5))
参数解释
position_dodge2(preserve = "single"):统一所有柱子的宽度,包括只有单个分组的对照组。padding = 0.5:调整单分组元素(对照组)的左右留白,让误差线的宽度和其他组保持一致。你可以根据需要微调这个值(比如0.4或0.6),找到最贴合的视觉效果。
内容的提问来源于stack exchange,提问作者Max F
相关产品推荐
相关产品推荐

