带有显著差异和交互作用的条形图?

11

我想可视化我的数据和ANOVA统计。通常使用柱形图,并添加表示显著差异和交互作用的线条来完成此操作。如何使用R创建此类图表?

这是我想要的:

显著差异:

significant differences

显著交互作用:

significant interactions

背景

我目前正在使用barplot2{ggplots}绘制柱状图和置信区间,但我愿意使用任何软件包/过程来完成工作。为了获得统计信息,我目前正在使用TukeyHSD{stats}pairwise.t.test{stats}来进行差异分析,使用其中一个anova函数(aovezANOVA{ez}gls{nlme})来进行交互作用分析。

只是为了给您一个想法,这是我的当前画面: barplot2 with CIs


2
在multcomp中有一个plot.cld函数,您可以在条形图上放置表示显著性的字母。也许这对您有所帮助... - EDi
è؟کوœ‰و‌¥è‡ھagricolaeهŒ…çڑ„bar.groupه‡½و•°ï¼Œهڈ¯ن»¥ن¸؛و‚¨و·»هٹ ه­—و¯چم€‚ - mnel
如果您使用基本的R语言的barplot函数,您可以像这样存储每个条形柱的中心点:barstore <- barplot(1:3)。为了验证这一点,您可以尝试使用 abline(v=barstore) 命令,注意到所有的垂直线都穿过了条形柱的中心点。使用 segments 函数,您可以使用这些存储的点来绘制比较/交互线。 - thelatemail
不是条形图,而是一种整洁的可视化ANOVA结果的方法在这里:http://stats.stackexchange.com/a/28155/7744 - Ben
https://dev59.com/TEzSa4cB1Zd3GeqPjA3V - Ben Bolker
3个回答

9

由于您使用了库gplots中的函数barplot2(),因此将使用此方法进行示例。

首先,根据barplot2()函数的帮助文件创建条形图。 ci.lci.u是虚假置信区间值。应将条形图保存为对象。

hh <- t(VADeaths)[1:2, 5:1]
mybarcol <- "gray20"
ci.l <- hh * 0.85
ci.u <- hh * 1.15
mp <- barplot2(hh, beside = TRUE,
               col = c("grey12", "grey82"),
               legend = colnames(VADeaths)[1:2], ylim = c(0, 100),
               cex.names = 1.5, plot.ci = TRUE, ci.l = ci.l, ci.u = ci.u)

如果你查看对象 mp,它包含了所有柱子的x坐标。

 mp
     [,1] [,2] [,3] [,4] [,5]
[1,]  1.5  4.5  7.5 10.5 13.5
[2,]  2.5  5.5  8.5 11.5 14.5

现在我使用上限置信区间值来计算段的y值坐标。每个段将从置信区间结束位置加1开始。 y.cord 包含四行 - 第一行和第二行对应于第一个条形图,其他两行对应于第二个条形图。最高的y值是根据每个条形图对应的置信区间最大值计算出来的。 x.cord 值只是重复了 mp 对象中的相同值,每个值都重复了2次。

y.cord<-rbind(c(ci.u[1,]+1),c(apply(ci.u,2,max)+5),
          c(apply(ci.u,2,max)+5),c(ci.u[2,]+1))
x.cord<-apply(mp,2,function(x) rep(x,each=2))

制作完条形图后,使用 sapply() 根据计算出的坐标值绘制五条线段(因为这次有五个组)。

sapply(1:5,function(x) lines(x.cord[,x],y.cord[,x]))

为了在段落上方绘制文本,需要计算x和y坐标。其中,x是两条杆的x值中间点,y值是从每个杆对的置信区间的最大值加上一些常数所计算出来的。然后使用函数text()添加信息。
x.text<-colMeans(mp)
y.text<-apply(ci.u,2,max)+7
text(c("*","**","***","NS","***"),x=x.text,y=y.text)

enter image description here


3

我想现在你的问题已经被解决了,所以我会鼓励你使用一种更好的可视化数据的方法——点图。例如,将你的条形图与使用类似数据点构建的点图进行比较:

#example data similar to your barplot
d <- data.frame(group=rep(c("control","group1","group2"),each=4),
                esker=c(1.6,1.4,1.8,1.5,2,1.8,1.6,1.4,2.3,2,1.7,1.4),
                se=rep(0.1,12),
                cond=rep(c("t1","t2","t3","t4"),3))
#dotplot - you need Hmisc library for version with error bars
library(Hmisc)
Dotplot(cond ~ Cbind(esker, esker+se, esker-se) | group, data=d, col=1, 
        layout=c(1,3), aspect="xy",
        par.settings = list(dot.line=list(lwd=0), plot.line=list(col=1)))

enter image description here

与柱状图相比较,点图更易于水平绘制时看出差异,您不需要额外的图例、条形或颜色来显示条件,也不需要指南线和其他杂音元素。您可以在这三个面板中包含所有内容。当然,我理解您可能想要突出重要影响,并且它对小规模条件可能效果良好。但是,如果因子数量增加,则图表将会溢出星星和其他东西。

保持简单。保持点图。查看威廉·克利夫兰(William Cleveland)和爱德华·图夫特(Edward Tufte)的书籍以了解更多信息。


0

我建议使用ggplot而不是barplot,并且你可以像这样手动构建线条:

从类似以下的data.table开始: data.table used

gg <- ggplot(data, aes(x = time, y = mean, fill = type)) +
    geom_bar(stat = "identity", position = "dodge") +
    scale_fill_manual(values = c("RGX" = "royalblue2", "EX" = "tomato2")) +
    xlab("Post-treatment Time Point (months)") +
    ylab(paste("data", "Change Score")) +
    scale_y_continuous(expand = c(0, 0)) +
    ylim(c(0,max(data$mean*1.5)))

# add horizontal bars
gg <- gg + geom_errorbar(aes(ymax = hline, ymin = hline), width = 0.45)

# add vertical bars
gg <- gg + geom_linerange(aes(ymax = max(data$mean)+3, ymin = max(data$mean)+1), position = position_dodge(0.9))

# add asterisks   
gg <- gg + geom_text(data = data[1:2], aes(y = max(data$mean)+4), label = ifelse(data$p_value[1:2] <= 0.4, "*", ifelse(data$p_value[1:2] <= 0.05, "*", "")), size = 8)

gg

绘图输出


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