使用R中的multhist创建包含多个数据系列的直方图

时间:2013-07-26 10:59:55

标签: r graphics histogram plotrix

我想在同一个图上创建一个包含多个数据系列的直方图。我能找到的最好的方法是multhist()。我想要一个类似于hist()的样式的情节,虽然ggplot()也可用于执行此任务,但图形样式不是我想要的。

以下是一些示例数据:

df <- structure(list(year = c(2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L), count = c(187L, 199L, 560L, 1000L, 850L, 
400L, 534L, 911L, 390L, 1008L, 1173L, 1222L, 810L, 950L, 752L, 
1125L, 468L, 710L, 290L, 670L, 855L, 614L, 1300L, 950L, 670L, 
888L, 490L, 557L, 741L, 700L, 954L, 378L, 512L, 780L, 951L, 398L, 
1544L, 903L, 769L, 1399L, 1021L, 1235L, 1009L, 1222L, 255L)), .Names = c("year", 
"count"), class = "data.frame", row.names = c(NA, -45L))

这是我到目前为止使用的代码:

require(plotrix)
d2011<-df$count[df$year=="2011"]
d2012<-df$count[df$year=="2012"]
year<-list(d2011,d2012)
mh <- multhist(year, xlab="Count", ylab="Frequency", main="", cex.axis=1, col=c("dark gray", "light gray"), breaks=seq(0,1600, by=200))
box(bty="l", col="black")
legend.text<-c("2011","2012")
legend(locator(1), legend=legend.text, col=c("dark gray", "light gray"), pch=15, bty="n", cex=0.8)

这为我提供了一个'条形图样式'多直方图,但我在更改两个图形参数时遇到了问题。

  1. 我希望情节看起来更像直方图而不像条形图,所以首先我要删除(或减少)列之间的空间。我已尝试使用space = NULL,但此命令似乎不适用于multhist

  2. 我想更改x轴,以便在绘图上的条之间存在轴刻度标记,并且轴文本与刻度标记对齐,而不是位于条中点。我尝试使用axis(side=1, …),但由于multhist使用列表对象来创建绘图,因此这些命令似乎不起作用。

  3. 任何建议都将不胜感激。对于可以使用多个数据集绘制直方图的其他有用图形包的建议也将受到欢迎。

2 个答案:

答案 0 :(得分:5)

阅读barplot的文档以了解如何指定零空间:

multhist(year, xlab="Count", ylab="Frequency", main="", 
         cex.axis=1, col=c("dark gray", "light gray"), 
         breaks=seq(0,1600, by=200),
         space=c(0,0), beside=TRUE)

enter image description here

以下是ggplot2和theme_bw的示例:

library(ggplot2)

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_histogram(position="identity", alpha=0.5, breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw(base_size=20) +
  xlab("values")

enter image description here

或者如果你真的想要它来自multhist的情节(这不容易解释):

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_histogram(position="dodge", breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw(base_size=20) +
  xlab("values") +
  scale_x_continuous(breaks=seq(100,1500, by=200))

enter image description here

答案 1 :(得分:3)

对于叠加直方图,我更喜欢使用密度图。它们在眼睛上更容易,特别是如果你有更薄的箱子和更多的箱子。有了你的数据,就可以得到这个。

ggplot(df, aes(x=count,group=year,fill=as.factor(year))) + 
  geom_density(position="identity", alpha=0.5, breaks=seq(0,1600, by=200),right=TRUE) +
  scale_fill_discrete(name="Year") +
  theme_bw() +
  xlab("values")

density plot