You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 in if (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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:48:20