如何在箱形图的子组之间添加重要性栏

时间:2019-04-14 11:17:53

标签: r ggplot2 boxplot

我想进行一次wilcox测试,并在箱图中为每个组(而不是组之间)添加一个显着性条。即比较时间2、6和14的子组(“ 0”,“ 1”)。 这是我到目前为止的内容:

WS =时间
DV =效果
count =子组(“ 0”或“ 1”)

p <- ggplot(data, aes(x=WS, y=DV, group=count))
p <- p + geom_boxplot(aes(fill=factor(count), group=interaction(WS, count)))
p <- p + stat_summary(fun.y=median, geom="smooth", aes(group=factor(count), color =factor(count)))
p <- p + scale_x_continuous(breaks = c(2,6,14))
p

Output from code

添加时

p <- p + geom_signif(comparisons = list(c("0", "1")),
              map_signif_level=TRUE,test='wilcox.test')

到上面,我得到以下错误:

Error in f(...) : 
  Can only handle data with groups that are plotted on the x-axis

我假设仅当数据在x轴上时才能进行比较。但是,我想使绘图保持现在的样子,x轴上的时间为2、6和14。我该怎么解决?

1 个答案:

答案 0 :(得分:1)

ggsignif的插图开始(请参阅??ggsignif),我了解到对于使用position='dodge'的图层(箱形图的情况是这样,因为您有一个interinteration进行分组), '需要自己提供位置和注释(标签)。

您可以像这样计算所有值:

p <- ggplot(data, aes(x=WS, y=DV, group=count))
p <- p + geom_boxplot(aes(fill=factor(count), group=interaction(WS, count)))
p <- p + stat_summary(fun.y=median, geom="smooth", aes(group=factor(count), color =factor(count)))
p <- p + scale_x_continuous(breaks = c(2,6,14))

p.values <- sapply(split(data, data$WS), function(x){wilcox.test(DV~count, x)$p.value})
labels <- symnum(p.values, corr = FALSE, cutpoints = c(0,  .001,.01,.05, 1), symbols = c("***","**","*","n.s."))
y.values <- sapply(split(data, data$WS), function(x){max(sapply(split(x, x$count), function(xx){boxplot(x$DV, plot=F)$stats[5, ]}))})+2

p <- p + geom_signif(y_position = y.values, xmin = unique(data$WS)-.4, xmax = unique(data$WS)+.4, annotations = labels)
p

这给出: enter image description here