R语言ggplot2设置position_dodge后geom_bar误差棒混乱问题求助
ggplot2分组柱状图误差棒错位解决方法
核心问题原因
- 分组映射错误:原代码中
fill = test写在了aes()的括号外部,没有纳入全局美学映射,误差棒图层无法识别需要按test变量分组躲避,默认在每个x轴刻度中心位置渲染,自然和分组柱子错位。 - 躲避宽度不匹配:geom_bar使用了默认参数的
position='dodge',geom_errorbar指定的是position_dodge(0.5),两者的躲避宽度不一致,进一步加剧了错位问题。 - 补充:原代码geom_signif中填写的Condition值为CTL,和数据集里的实际水平CTR不符,会导致显著性标记无法正常显示。
修正后完整代码
library(ggplot2) library(ggsignif) library(Rmisc) # 用于summarySE函数 # 你提供的示例数据集直接使用即可 tgc <- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Visible", "Remembered"), class = "factor"), Condition = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("CEN", "IPS", "CTR"), class = "factor"), test = structure(c(1L, 2L, 1L, 2L, 1L, 2L), .Label = c("Pretest", "Posttest"), class = "factor"), N = c(12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12), EE = c(7.33336873483333, 6.80361546108333, 7.09299323975, 7.85694358425, 7.03401583625, 6.98843623408333, 6.64690423166667, 6.76286593966667, 6.53229116175, 6.597801229, 5.87755052541667, 6.29406939166667), sd = c(1.10209636894719, 0.640166385925573, 0.829194321849813, 0.815786383997366, 1.13990647741682, 0.831699837406531, 0.894188346279884, 0.836594325568601, 0.762116322320573, 0.810426854086389, 0.986911196860133, 0.835898962602035), se = c(0.318147817642284, 0.18480011762014, 0.239367782465249, 0.235497244201055, 0.329062655793799, 0.240091062505814, 0.258129941215459, 0.241503979534773, 0.220004031922795, 0.233950081182639, 0.284896722586727, 0.241303245536807), ci = c(0.700238625346207, 0.406742316465117, 0.526844937010058, 0.518325939729, 0.724262022142493, 0.528436865645932, 0.568140169990552, 0.531546675059109, 0.484225609422399, 0.514920656885223, 0.62705345857213, 0.531104862508461)), row.names = c(NA, -12L), class = "data.frame") # 修正后的绘图代码 ggplot(tgc, aes(x = Condition, y = EE, fill = test)) + # fill参数移入aes内部 geom_bar(stat = "identity", width = 0.5, color = "black", position = position_dodge(0.5)) + # 显式指定dodge宽度和bar宽度匹配 geom_errorbar(aes(ymin = EE - se, ymax = EE + se), width = 0.1, position = position_dodge(0.5)) + # 和bar的dodge宽度完全一致 ylim(0,9) + theme_bw() + geom_signif(data = data.frame(Condition = c("CEN","IPS", "CTR")), # 修正CTL为数据集里的CTR aes(y_position = c(8.5, 8.5, 8.5), xmin = c(0.8, 1.8, 2.8), xmax = c(1.2, 2.2, 3.2), annotations = c("**", "*", "NS")), tip_length = 0, manual = T, inherit.aes = F) + scale_fill_manual(values = c("grey80", "grey20")) + facet_grid(~ Group, scales = "free")
关键注意事项
- 所有分组相关的美学映射必须放在
aes()内部,才能被所有图层继承使用 - 分组柱状图和误差棒的
position_dodge参数值必须完全相同,才能保证误差棒对齐柱子中心 - 显著性标记的x轴坐标要和实际的因子水平对应,避免出现标记缺失或错位
内容的提问来源于stack exchange,提问作者Reuben Newton Addison
相关产品推荐
相关产品推荐

