R语言ggplot添加Wilcoxon检验水平p值标注求助
在ggplot连续y轴散点图中添加分组Wilcoxon检验p值
步骤1:加载所需包
需要用到ggplot2绘图、dplyr数据处理、rstatix计算统计量,ggsignif辅助标注(可选):
library(ggplot2) library(dplyr) library(rstatix) library(ggsignif)
步骤2:导入数据集
直接使用你提供的数据集结构生成数据框:
df <- structure(list(x = c("April", "April", "April", "May", "May", "May", "June", "June", "June", "July", "July", "July", "August", "August", "August", "September", "September", "September", "October", "October", "October", "November", "November", "November", "December", "December", "December", "January", "January", "January", "February", "February", "February"), g = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c"), y = c(4.748, 5.3388, 5.7433, 4.744, 5.4938, 6.1583, 4.767, 5.6, 6.2067, 4.889, 5.8363, 6.295, 4.887, 5.6413, 6.15, 4.94, 5.73, 6.1833, 4.974, 5.2113, 5.77, 5.022, 5.47, 5.9117, 4.964, 5.3425, 5.7217, 4.95, 5.15, 5.9833, 4.75, 5.425, 5.7833)), class = "data.frame", row.names = c(NA, -33L))
步骤3:计算每个月份的两两Wilcoxon检验p值
按月份分组,计算a/b/c三组间的Wilcoxon检验结果,并整理成标注所需格式:
p_vals <- df %>% group_by(x) %>% # 执行Wilcoxon秩和检验,非配对样本设paired=FALSE,配对样本改为TRUE wilcox_test(y ~ g, paired = FALSE) %>% # 可选:用Bonferroni方法调整p值,避免多重检验误差 adjust_pvalue(method = "bonferroni") %>% # 添加显著性标记(如*、**等) add_significance("p.adj") %>% mutate( # 设置标注的y轴位置:取每个月份y值的最大值+0.2(偏移量可按需调整) y.position = df %>% group_by(x) %>% summarise(max_y = max(y)) %>% pull(max_y) + 0.2, # 获取每个月份对应的x轴数值位置(保持原始月份顺序) x.position = as.integer(factor(x, levels = unique(df$x))) ) %>% # 筛选标注所需的关键列 select(x, group1, group2, p.adj, p.adj.signif, y.position, x.position)
步骤4:绘制图形并添加p值标注
用stat_pvalue_manual将p值水平标注在每个月份的上方:
ggplot(data=df, aes(x=x,y=y)) + geom_line(aes(group=g)) + geom_point(aes(color=g)) + # 用颜色区分分组,更直观 # 添加p值标注 stat_pvalue_manual( p_vals, aes(x = x.position, y = y.position, group1 = group1, group2 = group2, label = p.adj.signif), tip.length = 0.01, # 标注短线的长度 bracket.size = 0.3, # 括号线的粗细 hjust = 0.5, # 水平居中 vjust = 0, # 垂直对齐方式 size = 3 # 标注文字大小 ) + # 保持月份的原始显示顺序 scale_x_discrete(limits = unique(df$x)) + theme_bw() # 使用简洁的黑白主题
替代方案:用geom_signif直接标注
如果不想手动计算p值,也可以用geom_signif自动计算并标注:
ggplot(data=df, aes(x=x,y=y)) + geom_line(aes(group=g)) + geom_point(aes(color=g)) + geom_signif( data = df, aes(group = g), comparisons = list(c("a","b"), c("a","c"), c("b","c")), # 指定两两比较的分组 test = "wilcox.test", # 指定检验方法 map_signif_level = TRUE, # 显示显著性标记而非原始p值 y_position = df %>% group_by(x) %>% summarise(max_y = max(y)+0.2) %>% pull(max_y), x_position = as.integer(factor(df$x, levels = unique(df$x))), tip.length = 0.01, size = 0.3 ) + scale_x_discrete(limits = unique(df$x)) + theme_bw()
关键说明
- x轴是分类变量(月份),通过
as.integer(factor(x))将每个月份转换为数值位置,实现标注的精准定位。 - y轴位置取对应月份y值的最大值加偏移量,确保标注不会遮挡数据点。
- 可根据数据类型调整
wilcox_test的paired参数,配对样本需设为TRUE。 - 显著性标记和p值格式可通过修改
label参数调整(比如用paste0("p=", round(p.adj, 3))显示原始p值)。
内容的提问来源于stack exchange,提问作者Sean Hats
相关产品推荐
相关产品推荐

