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
相关产品推荐
相关产品推荐

