11

我想可视化我的数据和方差分析统计。通常使用带有表示显着差异和相互作用的添加线的条形图来执行此操作。你如何使用 R 制作这样的情节?

这就是我想要的:

显着差异:

显着差异

重要的相互作用:

重要的相互作用

背景

我目前正在使用barplot2{ggplots}绘制条形图和置信区间,但我愿意使用任何包/程序来完成工作。获取我当前使用的统计数据TukeyHSD{stats}或用于差异和用于交互pairwise.t.test{stats}的 anova 函数 ( aov, ezANOVA{ez}, ) 之一。gls{nlme}

只是给你一个想法,这是我目前的情节: barplot2 与 CI

4

3 回答 3

9

当您使用barplot2()库中的函数时gplots,将给出使用这种方法的示例。

首先,按照barplot2()函数帮助文件中的说明制作条形图。ci.l并且ci.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)

如果您查看 object 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))

使用 barplot 后,sapply()使用计算的坐标制作五个线段(因为这次有 5 个组)。

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)

在此处输入图像描述

于 2013-03-21T13:02:32.463 回答
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)))

在此处输入图像描述

将其与条形图进行比较。在点图中,水平绘制时更容易看到差异,您不需要额外的图例或条形或颜色来显示条件,您不需要指南和其他嘈杂的元素。您拥有这三个面板中包含的所有内容。当然,我知道您可能想强调您的显着效果,并且它可能适用于少数情况。但是如果因素的数量增加,情节就会充满星星和狗屎。

把事情简单化。保持点图。查看 William Cleveland 和 Edward Tufte 的书籍以了解更多信息。

于 2013-03-21T16:53:18.407 回答
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

绘图输出

于 2017-01-11T23:11:34.623 回答