geom_signif 不同 x 和同一组的箱线图之间

geom_signif between boxplots of different x and same group

我如何测试箱线图 x='a' 和 x='b' 之间的差异,两者都是 group='g1',然后箱线图 x='a' 和x='b' 都是 group='g2'?

d = data.frame(c('a', 'a', 'a', 'a', 'b', 'b', 'b','b'),
               c(13, 12, 12, 5, 14, 6, 10, 11),
               c('g1','g2','g1','g2','g1','g2','g1','g2')) %>%
  `colnames<-`(c("x", "y", "group"))

> d
  x  y group
1 a 13    g1
2 a 12    g2
3 a 12    g1
4 a  5    g2
5 b 14    g1
6 b  6    g2
7 b 10    g1
8 b 11    g2

ggplot(d,
       aes(x, y,
           fill = group)) +
  geom_boxplot() +
  ggsignif::geom_signif(comparisons = combn(levels(factor(d$x)), 2, simplify = F))

这显示了测试“a”与“b”的结果:

但我想得到的是按组分层的,像这样:

一种方法是使用 xgroup 变量之间的交互:

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

d %>%
  mutate(x2 = interaction(group, x)) %>%
  ggplot(aes(x2, y, fill = group)) +
  geom_boxplot() +
  geom_signif(comparisons = list(c(1, 3),
                                 c(2, 4)), 
              y_position = rep(max(d$y), 2) * c(1, 1.05))

这会更改 x 轴上的标签,这可能不是您想要的。为了使轴与原始图保持一致,我们可以通过使用连续尺度并适当设置中断和标签来模拟离散尺度。

d %>%
  mutate(x2 = as.integer(interaction(group, x))) %>%
  ggplot(aes(x2, y, group = x2, fill = group)) +
  geom_boxplot() +
  geom_signif(comparisons = list(c(1, 3),
                            c(2, 4)),
              y_position = rep(max(d$y), 2) * c(1, 1.05)) +
  scale_x_continuous(breaks = c(1.5, 3.5), labels = c("a", "b"))