ggpubr分面绘图后仅单分面显示显著性标注括号问题问询
分面配对t检验标注缺失原因与解决方案
问题原因
- ggpubr的
stat_compare_means默认开启hide.ns = TRUE参数,会自动隐藏p>0.05的不显著(NS)结果,包括对应的括号和标注文本。你提供的女性分组数据配对t检验结果为不显著,因此默认被隐藏,部分旧版本ggpubr即使手动设置hide.ns = FALSE也会存在适配bug,导致NS标注不显示。 - 你固定了全局的标注位置,若y轴上限预留空间不足也可能导致标注被截断隐藏。
解决方案
方案1:调整stat_compare_means参数(适配新版本ggpubr)
先升级ggpubr到最新版本,然后在原有代码基础上补充强制显示NS的参数即可,修改后的完整代码如下:
library(ggplot2) library(ggpubr) library(dplyr) # 原有数据 demo = data.frame(percent = c(84.9,71.4,82.6,69.0,94.1,94.8,91.6,86.5,21.4,70.7,92.3,94.4,28.8,21.8,93.7,87.2), status = rep(c("Pre","Pre","Pre","Pre","Post","Post","Post","Post"),2), gender = c(rep("Male",8),rep("Female",8)), id = c(rep(c("1","2","3","4"),2),rep(c("5","6","7","8"),2))) compare = list(c("Pre","Post")) # 修改后绘图代码 demo %>% ggplot(aes(x=factor(status,c("Pre","Post")),y=percent,group=id)) + ylim(0,105) + # 调高y轴上限预留标注空间 geom_point(size = 2, aes(color = status)) + geom_line() + facet_grid(~ gender,switch = "x") + theme(legend.position = "none", axis.title.x = element_blank(), strip.placement = "outside", strip.text.x = element_text(angle=0)) + stat_compare_means(comparisons = compare, label="p.signif", method = "t.test", paired=T, label.y = 102, label.x = 1.5, tip.length=0, hide.ns = FALSE, # 核心参数:不隐藏NS结果 ns.show = TRUE) # 适配部分版本,强制显示NS标注
方案2:手动计算p值添加标注(兼容性最强,无版本问题)
如果调整参数后仍然不显示,可以先按分面分组计算p值和对应标注,再用geom_signif手动添加,完全可控,代码如下:
# 按分面分组计算p值和标注 p_val <- demo %>% group_by(gender) %>% summarise(p = t.test(percent ~ status, paired = TRUE)$p.value) %>% mutate(label = case_when( p < 0.001 ~ "***", p < 0.01 ~ "**", p < 0.05 ~ "*", TRUE ~ "NS" ), y_pos = 102, xmin = 1, xmax = 2) # 绘图手动添加标注 demo %>% ggplot(aes(x=factor(status,c("Pre","Post")),y=percent,group=id)) + ylim(0,105) + geom_point(size = 2, aes(color = status)) + geom_line() + facet_grid(~ gender,switch = "x") + theme(legend.position = "none", axis.title.x = element_blank(), strip.placement = "outside", strip.text.x = element_text(angle=0)) + geom_signif(data = p_val, aes(xmin = xmin, xmax = xmax, annotations = label, y_position = y_pos), manual = TRUE, tip_length = 0, inherit.aes = FALSE)
内容的提问来源于stack exchange,提问作者Jeff238
相关产品推荐
相关产品推荐

