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

ggpubr中为fill分组添加stat_compare_means显著性标记的方法

不显示显著性标记的核心原因

stat_compare_means 默认会把比较逻辑锚定到 x轴映射的离散变量 上,也就是你当前代码里的Paper字段,它会自动匹配x轴上不同Paper的分组做显著性检验。但你实际要比较的是同一x刻度位置下、由fill映射的Procedure分组的差异——因为预设的比较组合是Skin/SMAS/Extended,这些值属于Procedure的水平,根本不是x轴上Paper的分组水平,代码在x轴的分组里找不到对应的匹配项,自然不会渲染任何标记。调换x和fill映射能显示,就是因为被比较的分组刚好变成了x轴的映射变量,符合函数的默认匹配逻辑。

不改动现有x/fill映射的实现方案

不需要调整原有的坐标轴和填充映射,只需要手动指定比较的分组规则和位置偏移,让标记对齐到对应分组即可,常用两种可落地的实现:

方案1:让函数直接识别fill映射的比较分组(代码改动最少)

给stat_compare_means显式传入分组指定,告诉它需要比较的是Procedure而不是x轴的Paper,同时和箱线图的位置偏移保持一致,直接追加到原有绘图代码后即可:

# 原有绘图代码完全保留,仅在最后追加以下图层
+ stat_compare_means(
  aes(group = Procedure), # 显式指定比较对象为fill映射的Procedure变量
  comparisons = my_comparisons,
  method = "t.test", # 根据你的统计检验需求调整检验方法
  position = position_dodge(width = 0.8), # 和geom_boxplot的默认位置偏移完全对齐
  tip.length = 0.01,
  label = "p.signif" # 可按需换成p.format显示具体p值
)

注意:这个方法的适用前提是,x轴每个Paper的取值下,都完整存在全部3类Procedure的样本。如果某组缺失某类Procedure的样本,函数会自动跳过缺失的分组,可能出现标记不显示的情况。

方案2:手动指定比较对的坐标位置(适配缺失值场景,稳定性最高)

如果存在分组样本缺失的情况,可以绕开函数的自动分组匹配逻辑,手动指定每对比较在x轴上的左右端点坐标,完全不会出现匹配失败的问题:

  • 先确认x轴上每个Paper的基础坐标:按Paper的因子顺序,坐标从1开始依次为1,2,3...
  • 每个基础坐标下,不同Procedure分组的水平偏移和箱线图的偏移规则一致,默认宽度0.8,3个分组的偏移量分别是 -0.27, 0, +0.27
  • 手动构造每对比较的x端点坐标,传入参数即可
    以x轴第1个Paper位置的3组比较为例,手动定义坐标对的代码如下:
    # 手动定义比较的左右x坐标
    my_comparisons_xy <- list(
      c(1-0.27, 1),    # Skin vs SMAS
      c(1-0.27, 1+0.27), # Skin vs Extended
      c(1, 1+0.27)     # SMAS vs Extended
    )
    
    # 追加图层到原有绘图对象
    p + stat_compare_means(
      comparisons = my_comparisons_xy,
      method = "t.test",
      label = "p.signif",
      y.position = c(20, 25, 30) # 按你的y轴取值范围调整标记的高度即可
    )
    

这种方式因为是直接指定坐标,不依赖函数自动匹配分组,即使有样本缺失、分面尺度不统一的情况,标记也能正常渲染。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 00:15:00