使用数据框中的列绘制多个箱线图

21

我想为数据框中每列不相关的列绘制一个单独的箱线图。我认为使用sfsmsic包中的boxplot.matrix是正确的方法,但似乎和boxplot(as.matrix(plotdata)做的一样,这将在共享的箱线图中绘制所有内容并使用共享的坐标轴比例尺。我希望(比如说)有5个单独的图。

我可以手工完成这个操作,比如:

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

但是一定有一种方法可以使用数据帧列吧?

编辑:我使用了迭代,请查看我的答案。

3个回答

25

你可以使用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")

1
“melt”和“stack”的区别是什么? - Dan Chaltiel

18

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

因此我们只需要将矩阵的列转换为列表:

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

如果你真的想要每个面板只有一个箱线图(尽管,说实话,我不知道你为什么想这样做),我建议你使用ggplot和分面:

m1 <- melt(as.data.frame(m))
library(ggplot2)
ggplot(m1,aes(x = variable,y = value)) + facet_wrap(~variable) + geom_boxplot()

1
使用此代码仍会返回一个具有多个 x 类别的单一图。我试图为矩阵中找到的每个 x 类别制作单独的图。我使用的代码是 par(mfrow=c(2,5)) boxplot(x = as.list(as.data.frame(plotdata))),其中 plotdata 是一个 ...x9 的双精度矩阵。 - gisol
我想要分开的图表,因为它们是不相关的变量,具有不同的比例尺。如果将它们全部绘制在一起,一个会支配其他的,你会得到8个挤在一起难以辨认的图表和一个大图表。我想要9个单独的图表,这可以很容易地通过我的原始问题中的代码实现。然而,我希望通过让R自动化这个过程来加快速度,通过对数据框中的每个变量(列)进行箱线图绘制来实现这一点。 - gisol
@gisol 如果您决定使用ggplot,那么在分面时可能需要使用scales = "free_y" - joran

6
我使用迭代来完成这件事。我想也许我在原问题中没有表述清楚。不管怎样,感谢大家的回复。
par(mfrow=c(2,5))
for (i in 1:length(plotdata)) {
        boxplot(plotdata[,i], main=names(plotdata[i]), type="l")

}

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