如何将emmeans生成的组间对比p值添加到ggplot箱线图上
具体操作方法
stat_pvalue_manual要求输入的数据框必须包含要对比的两组名称(group1、group2)、p值以及标注位置信息,你只需将emmeans输出的对比表做简单格式转换即可,操作步骤如下:
- 第一步:加载必备依赖包
library(lme4) library(emmeans) library(tidyverse) library(ggsignif)
- 第二步:转换emmeans对比结果格式
将contrast列拆分为group1和group2两列,对应要对比的两个Stage分组,同时可根据需要生成显著性星号标注:
# 提取emmeans对比结果并转换为数据框 contrast_df <- as.data.frame(emmeans(LMM.fit, pairwise ~ Stage)$contrasts) %>% # 按 " - " 拆分对比列,得到两个分组的名称 separate(contrast, into = c("group1", "group2"), sep = " - ", remove = FALSE) %>% # 可选:生成显著性星号标注,也可直接用p.value作为标注内容 mutate( sig_label = case_when( p.value < 0.001 ~ "***", p.value < 0.01 ~ "**", p.value < 0.05 ~ "*", TRUE ~ "ns" ) )
- 第三步:设置显著性标注位置
有两种可选方案:
- 手动设置:根据你的箱线图y轴范围,给每个对比设置不同的y轴高度,避免标注重叠。你原有的箱线图Proportion范围为0-1,可将标注高度设置在1.05-1.4区间内。
- 自动设置:调用
add_xy_position()函数自动计算标注位置,无需手动调整,代码如下:
contrast_df <- contrast_df %>% add_xy_position(x = "Stage", fun = "max")
- 第四步:绘制带p值标注的箱线图
你原有的箱线图如下:
在原有绘图代码的基础上添加stat_pvalue_manual层即可添加p值标注,示例代码如下:
# 手动设置标注高度的绘图代码 y_positions <- c(1.05, 1.15, 1.25, 1.35, 1.1, 1.2, 1.3, 1.08, 1.18, 1.28) ggplot(tab, aes(x = Stage, y = Proportion)) + geom_boxplot() + # 添加p值标注层 stat_pvalue_manual( data = contrast_df, x = "group1", xmin = "group1", xmax = "group2", label = "sig_label", # 若要直接显示p值,此处改为"p.value"即可 y.position = y_positions, tip.length = 0.01 # 调整显著性条两端短竖线的长度 ) + # 调整y轴上限,留出足够空间显示标注 ylim(NA, 1.4)
注意:请确保你的
Stage变量的因子水平顺序和箱线图x轴的展示顺序完全一致,否则会出现标注错位问题。你可以用levels(tab$Stage)查看当前顺序,不一致时可通过factor(tab$Stage, levels = c("Stage1","Stage2","Stage3","Stage4","Stage5"))重新指定顺序。
内容的提问来源于stack exchange,提问作者learners
相关产品推荐
相关产品推荐

