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

如何在ggplot2分组柱状图中添加指定组内对比的显著性标记?

在ggplot2分组柱状图中添加组内对比的显著性标记(带括号)

核心思路

利用geom_signif的手动模式,结合你已有的contrasts_df(包含组内对比的显著性结果),指定每个对比的x轴位置、显著性标签,实现带括号的组内对比标记。


步骤1:处理显著性标签

先把contrasts_df中的p值转换成常用的显著性星号(*、**、***或ns):

library(dplyr)

# 转换p值为显著性标签
contrasts_df <- contrasts_df %>%
  mutate(
    sig_label = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns" # 不显著标记
    )
  )

步骤2:计算对比的坐标位置

分组柱状图用position_dodge()拆分不同Fdev组,需要给每个对比计算左右x坐标(对应要对比的两个柱子)和y轴位置(放在误差棒上方):

假设你的FtrialType水平为less、same、more,position_dodge(width = 0.8),按以下规则计算坐标:

contrasts_df <- contrasts_df %>%
  # 从contrast列中拆分出Fdev分组和对比的两个FtrialType(需匹配你的contrast格式)
  mutate(
    # 示例:contrast列格式为"Agreement more - Agreement same"
    Fdev = stringr::str_extract(contrast, "^\\w+"),
    trial_pair = stringr::str_extract_all(contrast, "(less|same|more)", simplify = TRUE),
    trial1 = trial_pair[,1],
    trial2 = trial_pair[,2]
  ) %>%
  # 给每个FtrialType分配基础x轴坐标
  mutate(
    base_x = case_when(
      FtrialType == "less" ~ 1,
      FtrialType == "same" ~ 2,
      FtrialType == "more" ~ 3
    ),
    # 根据Fdev分配偏移量(匹配position_dodge的宽度)
    dodge_offset = ifelse(Fdev == "Agreement", -0.4, 0.4), # dodge宽度0.8,偏移量为±0.4
    # 计算对比的左右x坐标
    xmin = base_x[match(trial2, FtrialType)] + dodge_offset,
    xmax = base_x[match(trial1, FtrialType)] + dodge_offset,
    # 设置y轴位置(误差棒上方,可根据图表调整倍数)
    y_pos = max(means_df$upper.CL) * 1.1
  )

步骤3:添加显著性标记到图表

在基础柱状图上用geom_signif的手动模式添加标记:

library(ggplot2)

# 先绘制基础分组柱状图(含误差棒)
p <- ggplot(means_df, aes(x = FtrialType, y = emmean, fill = Fdev)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
                position = position_dodge(width = 0.8), width = 0.2) +
  # 其他自定义设置(比如主题、坐标轴标签等)
  theme_minimal()

# 添加带括号的显著性标记
p + geom_signif(
  data = contrasts_df,
  aes(xmin = xmin, xmax = xmax, annotations = sig_label, y_position = y_pos),
  manual = TRUE,
  tip_length = 0.01, # 调整括号小尾巴的长度
  vjust = -0.2,      # 调整星号相对于括号的垂直位置
  textsize = 4        # 调整星号大小
)

注意事项

  • 如果你的FtrialType水平顺序不同,要对应修改base_x的赋值
  • dodge_offset必须和position_dodge(width = ...)匹配(偏移量=宽度/2)
  • y_pos可以根据图表的实际高度调整,避免和误差棒或柱子重叠
  • 如果contrast列格式和示例不同,要调整stringr的提取规则,确保正确拆分出Fdev和对比的两个FtrialType

内容的提问来源于stack exchange,提问作者Elsa B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:24:55