使用ggplot在一页上将数据框中的每一列绘制成直方图。

23

我想使用直方图在一个页面上绘制数据框的每一列。以下是使用R附带的示例“diamonds”数据集的示例:

p = list()
for (i in 1:ncol(diamonds)) p[[i]] <- qplot(diamonds[,i], xlab=names(diamonds)[[i]])
do.call(grid.arrange, p)

在此输入图片描述

这段代码用于绘制所有的列,但是每一列的数据看起来都相同。因此,显然出了些问题。

这种方法是否正确?我肯定有一些愚蠢的语法错误将同一列的数据集分配给列表中的每个元素,但我不确定是哪里出了问题。

谢谢。


1
切割、颜色和净度不是数值变量,它们是因子。在这种情况下应该如何绘制它们(因为直方图在这种情况下意义不大)? - joran
2
我赞同joran所说的,但如果你可以忽略这些事情,你需要使用melt函数来处理数据(使用reshape2包),然后使用facet_wrap函数进行绘图。 - Justin
可能仍然有意义对每个类别的项目进行计数,但这仅仅是一个例子。我完全可以想办法删除那些列。 - oneself
在这种情况下,只需遵循@Justin的建议(也许他甚至会将其编写为答案...)。 - joran
不确定如何使用melt和facet_wrap来完成这个任务。melt似乎允许从数据框中选择列,但我不确定如何使用facet_wrap来绘制它们。 - oneself
1个回答

46

给你:

library(reshape2)
library(ggplot2)
d <- melt(diamonds[,-c(2:4)])
ggplot(d,aes(x = value)) + 
    facet_wrap(~variable,scales = "free_x") + 
    geom_histogram()

在此输入图片描述

melt函数使我们能够使用生成的分组变量(称为variable)将数据拆分成多个组,并为每个组绘制直方图。请注意使用scales = "free_x",因为每个变量具有明显不同的范围和比例尺。


1
我还发现将行数/列数传递给包装器非常有用:ggplot(d,aes(x = value)) +geom_histogram() + facet_wrap(~variable,scales = "free_x", nrow=2) 或者 ggplot(d,aes(x = value)) +geom_histogram() + facet_wrap(~variable,scales = "free_x", ncol=4) - JelenaČuklina
有没有一种方法可以将y轴绘制为频率?即每个y轴在固定增量内从0到1,每个x轴从0到数据中的最大值。 - Sophy
1
@Sophy 尝试在 geom_histogram() 层内添加 aes(y = ..ncount..) - joran
有人尝试过在x轴上设置相同的增量吗?我尝试使用scale_x_continuous(breaks=50),但除了移除x轴上的所有标签外,它并没有起作用。 - Sophy

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