You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:01:17