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

如何在同一张ggplot图中多次使用stat_compare_means进行组间比较?

解决时间序列图中自动添加组间Wilcoxon检验标记的问题

核心代码实现

先确保加载所需包:

library(ggplot2)
library(ggpubr)
library(dplyr) # 用于构造示例数据,实际使用可忽略

1. 构造示例数据(替换成你的真实数据)

set.seed(123)
# 模拟时间点、组别、重复观测数据
time_points <- c("T0", "T1", "T2", "T3")
groups <- c("Control1", "Control2", "Treatment1")
data <- expand.grid(Time = time_points, Group = groups, Rep = 1:10)
# 生成带差异的数值
data$Value <- rnorm(nrow(data), 
                    mean = case_when(
                      data$Group == "Control1" ~ 5,
                      data$Group == "Control2" ~ 5,
                      data$Group == "Treatment1" ~ ifelse(data$Time == "T0",5, 7 + as.integer(data$Time)*0.5)
                    ),
                    sd = 1)
# 若时间是数值型,转成因子确保分组正确
data$Time <- as.factor(data$Time)

2. 绘制带自动显著性标记的时间序列图

ggplot(data, aes(x = Time, y = Value, color = Group)) +
  # 原始的均值、线、误差棒
  stat_summary(fun = mean, geom = "point", size = 3, position = position_dodge(0.5)) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2, position = position_dodge(0.5)) +
  geom_line(aes(group = Group), position = position_dodge(0.5)) +
  geom_point(alpha = 0.5, position = position_dodge(0.5)) +
  # 自动添加Wilcoxon检验标记的核心代码
  stat_compare_means(
    method = "wilcox.test",          # 指定Wilcoxon秩和检验
    comparisons = list(c("Treatment1", "Control2")), # 仅比较目标两组
    group.by = "Time",               # 按时间点分组计算检验
    label = "p.signif",              # 显示显著性标记(***, **, *, ns),换成"p.value"显示具体p值
    position = position_dodge(0.5),  # 和前面元素的偏移宽度一致,避免错位
    tip.length = 0.01,               # 调整显著性标记的短线长度
    size = 4                         # 调整标记文字大小
  ) +
  theme_bw()

关键注意事项

  • 必须指定group.by = "Time":这是实现每个时间点单独检验的核心,否则stat_compare_means会在整个数据集上做全局检验,而非分时间点计算。
  • comparisons参数精准指定对比组:排除不需要的Control1,只针对Treatment1和Control2做检验。
  • 时间变量格式:如果你的时间是连续数值(如1、2、3),务必转成因子类型,否则group.by无法正确识别分组。
  • 位置对齐:position_dodge(0.5)的宽度要和图中其他geom元素保持一致,避免显著性标记和对应组别错位。

问题排查

如果之前使用stat_compare_means失败,大概率是以下原因:

  • 未添加group.by = "Time"参数,导致检验范围错误。
  • 使用了旧版本的ggpubr包,建议更新到最新版本:install.packages("ggpubr")。
  • 传入了汇总后的均值数据(而非原始重复观测数据),Wilcoxon检验需要原始重复数据才能计算。

内容的提问来源于stack exchange,提问作者SamQu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:43:09