19

我想为数据框中的每个不相关列绘制一个单独的箱线图。我认为我boxplot.matrixsfsmsic包中走上了正确的轨道,但它似乎与将boxplot(as.matrix(plotdata)所有内容绘制在共享箱线图中并在轴上共享比例尺相同。我想要(比如说)5 个单独的地块。

我可以像这样手动做到这一点:

par(mfrow=c(2,2))
boxplot(data$var1
boxplot(data$var2)
boxplot(data$var3)
boxplot(data$var4)

但是一定有办法使用数据框列吗?

编辑:我使用了迭代,请参阅我的答案。

4

3 回答 3

24

你可以使用这个reshape包来简化事情

data <- data.frame(v1=rnorm(100),v2=rnorm(100),v3=rnorm(100), v4=rnorm(100))
library(reshape)
meltData <- melt(data)
boxplot(data=meltData, value~variable)

甚至然后使用ggplot2包使事情变得更好

library(ggplot2)
p <- ggplot(meltData, aes(factor(variable), value)) 
p + geom_boxplot() + facet_wrap(~variable, scale="free")
于 2012-07-05T14:58:02.107 回答
14

?boxplot我们看到,我们可以选择将多个数据向量作为列表的元素传递,我们将获得多个箱线图,一个对应于列表中的每个向量。

所以我们需要做的就是将矩阵的列转换为列表:

m <- matrix(1:25,5,5)
boxplot(x = as.list(as.data.frame(m)))

如果你真的想要单独的面板,每个面板都有一个箱线图(虽然,坦率地说,我不明白你为什么要这样做),我会转而使用ggplot和 faceting:

m1 <- melt(as.data.frame(m))
library(ggplot2)
ggplot(m1,aes(x = variable,y = value)) + facet_wrap(~variable) + geom_boxplot()
于 2012-07-05T14:56:11.727 回答
5

我使用迭代来做到这一点。我想也许我在最初的问题中并不清楚。感谢您的回复。

par(mfrow=c(2,5))
for (i in 1:length(plotdata)) {
        boxplot(plotdata[,i], main=names(plotdata[i]), type="l")

}
于 2012-07-06T08:58:04.000 回答