如何旋转ggpubr包stat_compare_means生成的多组配对t检验图p值
问题根因
stat_compare_means函数内部会调用geom_text图层渲染p值,顶层传入的样式参数(如angle、size、vjust等)不会自动传递给该文本图层,必须通过geom_text.args参数封装后传入才能生效,这就是直接加angle=90没有效果的原因。
可行解决方案
以下是完整可复现的修改后代码,适配分面配对t检验p值旋转需求:
# 加载依赖包 library(ggpubr) library(tidyr) # 构造示例配对数据 set.seed(123) df <- data.frame( id = rep(1:30, each = 3), group = rep(c("Control", "Treat1", "Treat2"), 30), value1 = rnorm(90, mean = c(5,7,8), sd = 1.5), value2 = rnorm(90, mean = c(4,6,9), sd = 1.2), value3 = rnorm(90, mean = c(6,7,10), sd = 1) ) # 转换为长格式用于分面 df_long <- pivot_longer(df, cols = starts_with("value"), names_to = "index", values_to = "score") # 绘制旋转p值的分面箱线图 ggboxplot(df_long, x = "group", y = "score", color = "group", facet.by = "index", add = "jitter") + stat_compare_means( comparisons = list(c("Control", "Treat1"), c("Control", "Treat2"), c("Treat1", "Treat2")), method = "t.test", paired = TRUE, # 所有文本样式参数统一封装到geom_text.args中 geom_text.args = list(angle = 90, vjust = 0.5, hjust = 0, size = 3) )
额外适配建议
- 如果运行时提示找不到
geom_text.args参数,请先升级ggpubr到最新版本,执行install.packages("ggpubr")即可 - 如果旋转后p值超出绘图区域,可以通过
ylim()扩大y轴范围,或者调整vjust/hjust参数控制文本对齐位置 - 如果p值位数过长显示不全,可以添加
label = "p.signif"参数仅显示显著性星号,减少文本占用空间 - 分面数量过多时,可以搭配
facet_wrap()的ncol/nrow参数调整分面布局,给每块子图留出足够的p值显示空间
内容的提问来源于stack exchange,提问作者Kamau Lindhardt
相关产品推荐
相关产品推荐

