如何修复ggerrorplot中stat_pvalue_manual显著性标记位置异常
问题根源
p1显著性标记错位是因为add_xy_position()默认计算坐标时未匹配分组图的位置闪避(dodge)规则:当x轴映射为dose、同时通过color映射supp/grp分组时,同个dose下的多组图元会沿x轴做等距偏移排布,但自动生成的xmin、xmax默认对齐dose的原始轴刻度位置,未叠加分组对应的偏移量,最终导致显著性条和图元错位。
对照场景p2能正常显示,是因为分面后每个分面的x轴仅映射supp变量,不存在同x刻度下的分组闪避,自动计算的坐标可以直接适配。
修复方法
核心是在add_xy_position()步骤明确指定和绘图一致的dodge宽度,ggpubr分组图默认闪避宽度为0.8,直接传入即可匹配位置。
修复原p1错位问题的代码
library(tidyverse) library(rstatix) library(ggpubr) df <- ToothGrowth grp<-rep(c("a","b","c"), 10) df$grp <- grp # 重新计算统计检验结果,指定dodge参数 stat.test_len <- df %>% group_by(dose) %>% dunn_test(len ~ supp) %>% add_xy_position(dodge = 0.8) # 关键参数,匹配绘图默认闪避宽度 # 重绘p1,显著性标记即可正常对齐 p1 <- ggerrorplot(df, x = "dose", y = "len", desc_stat = "mean_sd", color = "supp")+ stat_pvalue_manual(stat.test_len, label = "p.adj.signif", tip.length = 0, hide.ns = TRUE)
适配最终绘图需求的代码
最终需求为x轴展示dose、按grp的3个水平映射颜色、添加同dose下grp组间比较的显著性标记,代码如下:
# 计算grp组间的差异检验结果,同样指定dodge宽度 stat.test_grp <- df %>% group_by(dose) %>% dunn_test(len ~ grp) %>% add_xy_position(dodge = 0.8) # 绘制最终图,多组比较时添加step.increase避免显著性条重叠 p_final <- ggerrorplot(df, x = "dose", y = "len", desc_stat = "mean_sd", color = "grp") + stat_pvalue_manual(stat.test_grp, label = "p.adj.signif", tip.length = 0, hide.ns = TRUE, step.increase = 0.12)
注意事项
- 如果绘图时手动自定义了闪避宽度,比如设置
position = position_dodge(width = 0.6),需要把add_xy_position()里的dodge参数改成相同数值,否则仍会出现偏移。 - 同个dose下组对较多、显著性条重叠时,可调整
step.increase的数值,数值越大纵向间距越大。
内容的提问来源于stack exchange,提问作者Nidhi Desai
相关产品推荐
相关产品推荐

