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

如何在多分组箱线图上添加指定p值显著性标记

在自定义ggplot多分组箱线图中添加显著性标记

步骤1:准备统计检验数据

使用ggpubr包按X轴交互组(Tat | cocaine)分组,对Drugcc各组与参考组("0")进行Wilcoxon检验,并校正多重比较:

library(ggpubr)
library(dplyr)

# 生成统计检验结果
stat_test <- df %>%
  ungroup() %>% # 取消原数据分组,避免干扰后续分组检验
  group_by(T_c) %>% # 按T_c(即Tat与cocaine的交互组)分组
  pairwise_wilcox_test(
    formula = Size ~ Drugcc,
    ref.group = "0", # 指定参考组为Drugcc=0
    p.adjust.method = "BH" # 采用BH法校正多重比较p值
  )

# 调整显著性标记位置,匹配箱线图的dodge宽度
stat_test <- stat_test %>%
  add_xy_position(
    x = "T_c",
    dodge = 0.75, # 与自定义函数中boxplot的position_dodge2宽度一致
    step.increase = 0.1 # 自动调整不同标记的垂直间距,避免重叠
  )

步骤2:增强自定义绘图函数的灵活性

为原函数添加参数,支持选择性添加显著性标记,同时补全y轴标题的设置:

graphDrug <- function(.data, response, var1, var2, colorFill, color_fill_manual, legendFill, ytitle, add_signif = FALSE, signif_data = NULL){
  p <- ggplot(.data, aes(interaction(.data[[var1]], .data[[var2]], sep=" | "), .data[[response]], fill=factor(.data[[colorFill]])))+
    geom_boxplot(color = "black", alpha = 1, outlier.shape = NA, size=.25, position = position_dodge2(.75, preserve = "single"))+
    geom_point(pch = 21, alpha=.7, position = position_jitterdodge(jitter.width = .25))+
    
    scale_fill_manual(values = color_fill_manual, name = legendFill)+
    labs(y = ytitle)+ # 补全y轴标题设置
    
    theme_classic(base_size = par('din')[1] * 5)+
    theme(
      text = element_text(face = "bold"),
      legend.position = "top",
      panel.grid.major.x = element_blank(),
      axis.text=element_text(size=rel(1)),
      axis.text.y = element_text(angle = 90, vjust = 0.5, hjust = 0.5)
    )
  
  # 按需添加显著性标记
  if(add_signif && !is.null(signif_data)){
    p <- p + stat_pvalue_manual(
      signif_data,
      label = "p.adj.signif", # 显示校正后的显著性符号(*、**等)
      tip.length = 0.01,
      bracket.nudge.y = 0, # 可根据需求微调标记垂直位置
      step.increase = 0.1 # 自动优化标记间距
    )
  }
  
  return(p)
}

步骤3:生成带显著性标记的最终图形

调用修改后的函数,传入统计检验数据即可生成符合预期的图:

fig_name <- "Size"
color_fill_manual <- c("#ffffff", "#A6CEE3", "#1F78B4")

# 生成带显著性标记的箱线图
p <- graphDrug(
  df, 
  "Size", 
  "Tat", 
  "cocaine", 
  "Drugcc", 
  color_fill_manual, 
  "Drug", 
  bquote(bold(.(fig_name)~~(μm^2))),
  add_signif = TRUE,
  signif_data = stat_test
)

print(p)

关键注意事项

  • 匹配dodge宽度:add_xy_position中的dodge参数必须与geom_boxplot的position_dodge2宽度完全一致(此处为0.75),否则标记会错位。
  • 自动间距调整:step.increase参数会根据标记数量自动增加垂直间距,解决多组标记重叠问题。
  • 兼容性:该方案完全适配你的现有数据结构,即使X轴包含3个以上交互组也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:12:29