【问题标题】:Plot every column in a data frame as a histogram on one page using ggplot使用 ggplot 将数据框中的每一列绘制为一页上的直方图
【发布时间】:2012-10-23 17:15:28
【问题描述】:

我想在一页上使用直方图绘制 data.frame 的每一列。这是一个使用 R 附带的示例“钻石”数据集的示例:

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

这确实绘制了所有列,但每一列的数据看起来都一样。所以,显然有问题。

这是完成这项任务的正确方法吗?我确定我在某处有一些愚蠢的语法,将相同的列数据集分配给列表中的每个元素,但我不确定它是什么。

谢谢

【问题讨论】:

  • 切工、颜色和净度不是数值变量,它们是因素。应该如何绘制它们(因为直方图在这种情况下毫无意义)?
  • 我会支持 joran 所说的,但如果你可以忽略这样的事情,你想 melt 数据(reshape2 包)然后用 facet_wrap 绘图/跨度>
  • 统计每个类别的项目可能仍然有意义,但这只是一个示例。我完全可以以某种方式删除这些列。
  • 在这种情况下,只要听从@Justin 的建议(也许他甚至会把它写下来作为答案......)
  • 不确定如何为此使用 melt 和 facet_wrap。融化似乎允许人们从 data.frame 中选择列,但是我不确定如何使用 facet_wrap 来绘制它们。

标签: r ggplot2


【解决方案1】:

给你:

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

melting 允许我们使用生成的分组变量(称为variable)将数据分成组并为每个组绘制直方图。请注意scales = "free_x" 的使用,因为每个变量都有明显不同的范围和规模。

【讨论】:

  • 我还发现将行数/列数传递给包装器非常有用: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)
  • 有没有办法将 y 轴绘制为频率? IE。每个 y 轴以固定增量从 0 到 1,每个 x 轴从 0 到数据中的最大值。
  • @Sophy 尝试在geom_histogram() 层内添加aes(y = ..ncount..)
  • 有没有人尝试过在 x 轴上设置相同的增量,我试过 scale_x_continuous(breaks=50),除了删除 x 轴上的所有标签外,它不起作用。
猜你喜欢
  • 1970-01-01
  • 2023-02-08
  • 2016-10-24
  • 2019-08-19
  • 2023-01-07
  • 2019-07-12
  • 2020-10-28
  • 2017-05-26
相关资源
最近更新 更多