R - 如何将多个直方图绘制在一起?

4
我可以帮您进行翻译。这段内容是关于数据框的,有四列,长这个样子:
Beef-Low    Beef-High   Cereal-Low  Cereal-High
90          73          107         98
76          102         95          74
90          118         97          56
64          104         80          111
86          81          98          95
51          107         74          88
72          100         74          82
90          87          67          77
95          117         89          86
78          111         58          92

我想制作一个直方图,将四个列显示为不同颜色的条形图,因此我尝试了以下代码:

> hist(wt$Beef.Low, main="Weight Gain Across Four Diets", xlab="Weight Gain", col="coral", xlim=c(0,120), ylim=c(0,4))
> hist(wt$Beef.High, col="coral3", add=T)
> hist(wt$Cereal.Low, col="yellow", add=T)
> hist(wt$Cereal.High, col="yellow3", add=T)

这将产生:

Histogram

我不喜欢条形图的不透明性,因为它们掩盖了重叠直方图的形状。我知道我可以使用这里找到的代码手动编辑我的直方图颜色;但那似乎是一个繁琐的过程,我相信一定有更好的方法。

相反,我尝试复制在这个问题中所做的内容。

> bl = wt$Beef.Low
> bh = wt$Beef.High
> cl = wt$Cereal.Low
> ch = wt$Cereal.High
> wts = rbind(bl,bh,cl,ch)
> wtss = as.data.frame(wts)
> ggplot(wtss, aes("Weight", fill="Diet")) + geom_histogram(alpha=0.5, aes(y = "Frequency"), position="identity")

但它不起作用,我对ggplot命令的理解还不足以知道为什么。请帮忙。

1
对于 ggplot,首先最好将数据融合,就像这个回答中所示,这样会更容易绘制多个堆积直方图。 - rawr
@rawr:我不理解melt函数的作用。它说它创建了一个“molten dataframe”,但我不知道那是什么意思。 - Slavatron
1个回答

11

我倾向于使用facets来完成此操作。否则,使用您的数据集将会得到无法理解的结果。

library(reshape2)
library(ggplot2)
gg <- melt(wt)
ggplot(gg, aes(x=value, fill=variable)) +
  geom_histogram(binwidth=10)+
  facet_grid(variable~.)

编辑: 回应楼主的评论。

melt(...)函数将“宽”格式的数据 - 即不同列中的数据 - 转换为“长”格式的数据 - 所有数据都在一列中,并且第二列区分不同类型的数据(例如,标识此行中的数据来自哪个列)。

如果您像上面那样使用默认设置使用 melt(...)函数,则会创建一个包含两列的数据帧: $value 包含实际数据,$variable 包含此数据来自的起始数据帧中的列的名称。比较一下 wtgg,我想您就会明白我的意思了。

因此,在这里我们使用 value 作为 x 轴,根据 variable 分组数据。


1
这个方案非常完美,是我问题的优雅解决方案。但我仍然不理解melt函数的作用或者什么是融合数据框。 - Slavatron
1
@Slavatron 看起来它将 df 转换为单个向量以便于进行直方图处理。 - SqueakyBeak

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