使用geom_signif为分组柱状图添加显著性标记失败求助
解决分组柱状图内添加显著性标记的报错问题
问题背景
绘制两级分组柱状图:一级分组为REGION,二级分组为Pre_Ambos和Post_Ambos,尝试用geom_signif(comparisons = list(c("Pre_Ambos", "Post_Ambos")))添加组内显著性标记时,出现以下报错:
Warning message: Computation failed in
stat_signif()Caused by error inif (scales$x$map(comp[1]) == data$group[1] | manual) ...: ! missing value where TRUE/FALSE needed.
原代码如下:
# Build dataframe REGION <- c("Arica", "Tarapacá", "Antofagasta", "Atacama", "Coquimbo", "Valparaíso", "Metropolitana", "O'Higgins", "Maule", "Ñuble", "Bíobío", "Araucanía", "Los Ríos", "Los Lagos", "Aysén", "Magallanes", "Chile") Pre_Ambos <- c(11.33, 9.96, 10.24, 14.17, 13.43, 12.96, 11.47, 14.54, 14.58, 18.00, 12.19, 15.34, 16.10, 17.64, 16.34, 15.04, 13.96) Post_Ambos <- c(8.54, 7.60, 7.86, 10.44, 10.01, 11.97, 9.45, 13.07, 13.76, 11.56, 10.37, 14.48, 13.14, 15.04, 14.74, 12.07, 11.51) Dif_Ambos_Porc <- c(24.61, 23.74, 23.20, 26.30, 25.49, 7.67, 17.59, 10.10, 5.67, 35.80, 14.94, 5.60, 18.37, 14.74, 9.78, 19.76, 17.57) Table1 <- data.frame(REGION, Pre_Ambos, Post_Ambos, Dif_Ambos_Porc) View(Table1) #Pivoting Table1 |> select(REGION, Pre_Ambos, Post_Ambos, Dif_Ambos_Porc) |> pivot_longer(cols = c("Pre_Ambos", "Post_Ambos")) |> mutate(name = forcats::fct_relevel(name, c("Pre_Ambos", "Post_Ambos"))) -> Table1_p #Ploting ggplot(Table1_p, aes(x = REGION, y = value, fill = name)) + geom_col(position = "dodge") + scale_x_discrete(limits = Table1_p$REGION)
错误原因
报错核心是:stat_signif默认在全局范围内比较指定分组,但x轴映射的是REGION,每个REGION下有两个子分组(Pre/Post),直接指定comparisons会让统计模块无法定位到每个REGION内的子分组,进而出现NA值导致逻辑判断失败。
解决方法
需要明确告知stat_signif在每个REGION组内进行比较,同时设置合适的统计检验方法,并调整标记位置匹配柱状图的dodge间距:
- 在
geom_signif中添加group = ~REGION,指定分组比较的维度 - 设置
test参数选择合适的统计检验(如t.test或配对样本的paired.t.test) - 用
position = position_dodge(width = 0.9)对齐显著性标记和柱状图 - 可选:用
map_signif_level = TRUE自动将p值转为*符号,优化显示效果
修正后的完整代码
# Build dataframe REGION <- c("Arica", "Tarapacá", "Antofagasta", "Atacama", "Coquimbo", "Valparaíso", "Metropolitana", "O'Higgins", "Maule", "Ñuble", "Bíobío", "Araucanía", "Los Ríos", "Los Lagos", "Aysén", "Magallanes", "Chile") Pre_Ambos <- c(11.33, 9.96, 10.24, 14.17, 13.43, 12.96, 11.47, 14.54, 14.58, 18.00, 12.19, 15.34, 16.10, 17.64, 16.34, 15.04, 13.96) Post_Ambos <- c(8.54, 7.60, 7.86, 10.44, 10.01, 11.97, 9.45, 13.07, 13.76, 11.56, 10.37, 14.48, 13.14, 15.04, 14.74, 12.07, 11.51) Dif_Ambos_Porc <- c(24.61, 23.74, 23.20, 26.30, 25.49, 7.67, 17.59, 10.10, 5.67, 35.80, 14.94, 5.60, 18.37, 14.74, 9.78, 19.76, 17.57) Table1 <- data.frame(REGION, Pre_Ambos, Post_Ambos, Dif_Ambos_Porc) # Pivoting Table1 |> select(REGION, Pre_Ambos, Post_Ambos, Dif_Ambos_Porc) |> pivot_longer(cols = c("Pre_Ambos", "Post_Ambos")) |> mutate(name = forcats::fct_relevel(name, c("Pre_Ambos", "Post_Ambos"))) -> Table1_p # Ploting with significance markers library(ggplot2) library(ggsignif) ggplot(Table1_p, aes(x = REGION, y = value, fill = name)) + geom_col(position = position_dodge(width = 0.9)) + # 添加组内显著性标记 geom_signif( comparisons = list(c("Pre_Ambos", "Post_Ambos")), group = ~REGION, # 指定在每个REGION内比较 test = "t.test", # 选择合适的统计检验,配对样本可改为"paired.t.test" position = position_dodge(width = 0.9), # 对齐柱状图的dodge间距 map_signif_level = TRUE, # 自动将p值转为*标记 tip_length = 0.01 # 调整显著性标记的短线长度 ) + scale_x_discrete(limits = Table1_p$REGION) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
补充说明
- 若数据为配对设计(同一
REGION的Pre和Post是配对样本),建议将test改为"paired.t.test",确保统计检验的合理性 - 可通过
annotations参数手动指定显著性文本(需提前计算每个组的p值) - 调整
tip_length和y_position参数可优化显著性标记的显示位置
内容的提问来源于stack exchange,提问作者Francisco Bustamante
相关产品推荐
相关产品推荐

