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

stat_compare_means仅首个分面组显示统计结果的原因咨询

问题:ggplot2分面箱线图仅首个组显示stat_compare_means标记

我用ggplot2绘制分面箱线图并做均值比较,数据结构如下:

structure(list(Time = structure(c(1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), levels = c("4", "5", "6", "7", 
"8"), class = "factor"), Group = c("16S", "16S", "16S", "16S", 
"16S", "16S", "16S", "16S", "16S", "16S", "16S", "16S", "16S", 
"16S", "16S", "arabinan", "arabinan", "arabinan", "arabinan", 
"arabinan", "arabinan", "arabinan", "arabinan", "arabinan", "arabinan", 
"arabinan", "arabinan", "arabinan", "arabinan", "arabinan", "skrob", 
"skrob", "skrob", "skrob", "skrob", "skrob", "skrob", "skrob", 
"skrob", "skrob", "skrob", "skrob", "skrob", "skrob", "skrob"
), Cq = c(11.13063931, 11.15984429, 9.764765629, 11.11921187, 
11.23636015, 11.3220628, 13.57819885, 13.49193753, 12.10672097, 
14.44320106, 14.37544944, 8.47863564, 16.01102045, 12.85357539, 
13.86110729, 21.62921058, 19.90989407, 21.0387778, 19.30354718, 
19.63518702, 19.4119743, 17.06448567, 16.95057763, 16.9692573, 
14.96970081, 15.02672693, 14.98234806, 15.01538052, 14.75905977, 
14.78030967, 13.84361199, 14.17159598, 14.489989, 14.8658601, 
14.90056887, 14.66559991, 15.89827103, 15.49736892, 15.70061002, 
21.39779052, 21.39592915, 21.59904463, 22.61395674, 22.55805188, 
22.46050134), Starting.Quantity..SQ. = c(0.031695618, 
0.031098635, 0.07712746, 0.031932316, 0.029587343, 0.027981628, 
0.006440738, 0.006812815, 0.016788261, 0.003667335, 0.003832726, 
0.178184848, 0.001321415, 0.010323517, 0.005357244, 0.015890751, 
0.04604206, 0.02289834, 0.067002457, 0.054572433, 0.062654818, 
0.267772272, 0.287325838, 0.284024058, 0.978747868, 0.944815297, 
0.971118645, 0.951471738, 1.114997127, 1.100432813, 2.939653152, 
2.402067713, 1.974418707, 1.566470577, 1.533346405, 1.772052794, 
0.829527162, 1.06179707, 0.936892888, 0.02806249, 0.028094673, 
0.024791682, 0.013270704, 0.013735494, 0.014585847)), row.names = c(NA, 
-45L), class = "data.frame")

使用的代码:

library(ggplot2)
my_data <- read.csv("data", header = TRUE)
boxplot <- ggplot(my_data, aes(factor(Time), Starting.Quantity..SQ., fill = Group)) + facet_wrap(~Group) + geom_boxplot()
boxplot + stat_compare_means(comparisons = list(c("4", "5"), c("4", "6"), c("4", "7"), c("4", "8")), method="t.test", label="p.signif")

生成的图像仅首个分面组(Group)显示了stat_compare_means的统计分析结果,其余组无相关标记,咨询该问题的原因及解决方法。


原因分析
  • stat_compare_means默认仅处理全局首个分组:用facet_wrap分面时,该函数默认不会自动遍历每个分面的独立数据,只会对整个数据集的第一组(这里是16S)执行统计计算并添加标记。
  • 未指定分面内的独立统计逻辑:当前代码没有明确告诉统计函数要在每个分面内部单独处理对比,导致函数只执行了一次全局计算。
解决方法

需要让统计函数在每个分面内独立运行,以下是两种可行方案:

方案1:调整stat_compare_means的参数

通过指定group = Group,让函数在每个分面内独立处理对比:

library(ggplot2)
library(ggpubr)

# 加载你的数据
my_data <- structure(...) 

boxplot <- ggplot(my_data, aes(x = Time, y = Starting.Quantity..SQ., fill = Group)) +
  facet_wrap(~Group) +
  geom_boxplot()

boxplot + 
  stat_compare_means(
    comparisons = list(c("4", "5"), c("4", "6"), c("4", "7"), c("4", "8")),
    method = "t.test", 
    label = "p.signif",
    group = Group # 关键:指定按分面组独立计算
  )

方案2:使用geom_signif更精准控制

如果方案1效果不佳,可使用ggsignif包的geom_signif,开启分面组内独立统计:

library(ggplot2)
library(ggsignif)

# 加载你的数据
my_data <- structure(...) 

ggplot(my_data, aes(x = Time, y = Starting.Quantity..SQ., fill = Group)) +
  facet_wrap(~Group) +
  geom_boxplot() +
  geom_signif(
    comparisons = list(c("4", "5"), c("4", "6"), c("4", "7"), c("4", "8")),
    test = "t.test",
    map_signif_level = TRUE,
    facet.group = TRUE # 关键:开启分面内独立统计
  )

内容的提问来源于stack exchange,提问作者aetobatus-narinari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:32:23