如何绘制带有显著性水平的箱线图?

28

不久前我曾提出了一个关于绘制箱线图的问题Link1

我已经获得了一些包含三个不同组(或标签)请在此处下载的数据。 我可以使用以下R代码获取箱线图:

library(reshape2)
library(ggplot2)

morphData <- read.table(".\\TestData3.csv", sep=",", header=TRUE);
morphData.reshaped <- melt(morphData, id.var = "Label")

ggplot(data = morphData.reshaped, aes(x=variable, y=value)) + 
  + geom_boxplot(aes(fill=Label))

我在思考如何将显著性水平放置在盒形图上方。为了让自己更清楚,我在这里放了一张来自论文的截图:

Boxplot


注释是您所需的“重要性”吗,就像summary.lm中有时会看到的与p值并列的重要性代码一样?鉴于背景,零假设是每对样本均具有相同均值? ggplot对您来说是必须的吗? - vpipkt
2个回答

35
我知道这是一个老问题,DatamineR的答案已经提供了其中一个解决方法。但我最近创建了一个ggplot扩展程序,简化了添加显著性条的整个过程:ggsignif
不必费力地添加geom_lineannotate到您的图中,只需添加单个层geom_signif即可:
library(ggplot2)
library(ggsignif)

ggplot(iris, aes(x=Species, y=Sepal.Length)) + 
  geom_boxplot() +
  geom_signif(comparisons = list(c("versicolor", "virginica")), 
              map_signif_level=TRUE)

带显著性条的箱线图

该包的完整文档可在 CRAN 上找到。


26

我不太明白你所说的带有显著性水平的箱线图是什么意思,但是我有一个建议可以生成这些条形图:我会构建包含条形图坐标的小型数据框架。以下是一个例子:

pp <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_boxplot()
df1 <- data.frame(a = c(1, 1:3,3), b = c(39, 40, 40, 40, 39))
df2 <- data.frame(a = c(1, 1,2, 2), b = c(35, 36, 36, 35))
df3 <- data.frame(a = c(2, 2, 3, 3), b = c(24, 25, 25, 24))

pp + geom_line(data = df1, aes(x = a, y = b)) + annotate("text", x = 2, y = 42, label = "*", size = 8) +
     geom_line(data = df2, aes(x = a, y = b)) + annotate("text", x = 1.5, y = 38, label = "**", size = 8) +
     geom_line(data = df3, aes(x = a, y = b)) + annotate("text", x = 2.5, y = 27, label = "n.s.", size = 8)

在这里输入图片描述


谢谢您的回答!不过,如果您的ggplot有fill = factor(cyl),那么这个方法可能不起作用。您有什么想法是为什么吗? - Parsa
@par 你把它放在哪里了?如果你把它放在 geom_boxplot(aes(fill=factor(cyl))) 中,它就能工作了... - DatamineR
你必须将填充或颜色添加到各个几何对象中,而不是添加到 ggplot 的主要调用中;否则,ggplot 将把你的 aes() 参数视为全局参数,并且在后续对 geom 的调用中找不到它。虽然谢谢你的回答,但事实证明这很容易做到! - pat_krat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接