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

使用geom_signif实现ggplot2分组箱线图组内不同x水平的差异检验

分组箱线图按group分层标注组内差异的实现方案

核心逻辑:当同时设置x和fill映射时,ggplot会通过位置偏移(默认dodge宽度0.75)展示同x下的不同分组箱线,需要让geom_signif的位置偏移和箱线图对齐,或手动指定显著性条的坐标即可实现分层标注。

方法1:分层调用geom_signif(适配性更强)

完整可运行代码如下:

library(ggplot2)
library(ggsignif)
library(dplyr)

# 构造测试数据
d <- data.frame(
  x = c('a', 'a', 'a', 'a', 'b', 'b', 'b','b'),
  y = c(13, 12, 12, 5, 14, 6, 10, 11),
  group = c('g1','g2','g1','g2','g1','g2','g1','g2')
)

ggplot(d, aes(x = x, y = y, fill = group)) +
  # 统一指定dodge宽度,保证箱线和显著性条偏移量一致
  geom_boxplot(position = position_dodge(width = 0.8)) +
  # 标注g1组内a和b的差异
  geom_signif(
    data = ~filter(.x, group == "g1"),
    aes(group = group),
    comparisons = list(c("a", "b")),
    y_position = 14.5, # 显著性条的y轴高度,可自行调整
    tip_length = 0.01, # 显著性条两端短竖线的长度
    position = position_dodge(width = 0.8),
    map_signif_level = TRUE # 自动将p值转为*标记,不需要可以去掉
  ) +
  # 标注g2组内a和b的差异
  geom_signif(
    data = ~filter(.x, group == "g2"),
    aes(group = group),
    comparisons = list(c("a", "b")),
    y_position = 13,
    tip_length = 0.01,
    position = position_dodge(width = 0.8),
    map_signif_level = TRUE
  )

方法2:手动指定显著性条坐标(更灵活)

如果需要自定义标注内容、不需要自动计算p值,可以直接指定坐标批量生成标注:

ggplot(d, aes(x = x, y = y, fill = group)) +
  geom_boxplot(position = position_dodge(width = 0.8)) +
  geom_signif(
    # 自定义标注内容,也可以换成自己计算的显著性标记
    annotations = c(
      round(wilcox.test(y~x, filter(d, group == "g1"))$p.value, 3),
      round(wilcox.test(y~x, filter(d, group == "g2"))$p.value, 3)
    ),
    y_position = c(14.5, 13), # 两个显著性条的高度
    xmin = c(0.7, 1.3), # 每个显著性条的左端点x坐标
    xmax = c(1.7, 2.3), # 每个显著性条的右端点x坐标
    tip_length = 0.01
  )

参数调整说明

  • 如果你修改了箱线图的dodge宽度,需要同步调整geom_signif的dodge宽度,或者手动调整xmin/xmax的数值,保证显著性条和对应箱线对齐
  • y_position可以根据你的数据范围自由调整,避免标注和箱线、其他标注重叠
  • 检验方法默认是wilcox秩和检验,如果需要用t检验,可以给geom_signif加参数test = "t.test"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:03