如何给含两个统计分组变量和分面变量的ggplot添加p值括号?
问题解决方法
你的核心问题是给stat_pvalue_manual传错了数据源,且未正确配置分组偏移参数匹配箱线图的分组逻辑,导致p值括号无法生成。以下是修正方案:
关键修正点
- 数据源错误:
stat_pvalue_manual需要用统计结果stat.test作为数据源,而非合并后的原始数据集datamt - 分组偏移不匹配:添加
position = position_dodge(0.8),和箱线图的分组偏移保持一致,确保括号对齐分组 - 简化y轴位置计算:直接基于
stat.test中的y.position调整,避免重复数据干扰
修正后的完整代码
library(tidyverse) library(rstatix) library(ggpubr) datamt <- mtcars |> group_by(cyl, am) |> tidyr::unite("group", cyl, am, sep=" ", remove = F) |> filter(cyl != 8) # 原代码cyl!="8"类型不匹配,mtcars的cyl是数值型 datamt$compare <- rep(c("A", "B"), len=18) datamt <- rbind(datamt, datamt) stat.test <- datamt |> group_by(group)|> t_test(formula=mpg~compare, paired=F) |> # 补全缺失的管道符 add_significance() |> add_xy_position(fun="max", formula=mpg~compare, x = "group", dodge = 0.8, step.increase = 0) ggplot(data=datamt, aes(x=group, y=mpg, fill=compare)) + stat_boxplot(geom ='errorbar', width = 0.6, lwd=1, position=position_dodge(0.8), color="black")+ geom_boxplot(position=position_dodge(0.8)) + # 明确分组偏移,避免对齐误差 facet_wrap(facets=vars(cyl), ncol=4, scales="free")+ stat_pvalue_manual(data=stat.test, label="p.signif", hide.ns = T, x="group", y.position = stat.test$y.position * 1.1, position = position_dodge(0.8), bracket.shorten = 0.1) # 可选:调整括号缩短长度优化显示
额外说明
- 原代码中
cyl!="8"是类型错误,mtcars的cyl为数值型,需改为cyl!=8才能正确过滤数据 stat.test的管道链中t_test后缺失管道符,导致后续统计函数无法执行,已补全
内容的提问来源于stack exchange,提问作者Elizabeth W
相关产品推荐
相关产品推荐

