【问题标题】:Creating a histogram with multiple data series using multhist in R在 R 中使用 multhist 创建具有多个数据系列的直方图
【发布时间】:2013-07-26 14:56:22
【问题描述】:

我想在同一个图上创建一个包含多个数据系列的直方图。我能找到的最好的方法是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 使用列表对象来创建绘图,这些命令似乎不起作用。

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

【问题讨论】:

  • 你知道你可以改变ggplot2中的“图形风格”(使用themes)吗?
  • @Roland 感谢您的评论。我以前在 ggplot2 中遇到过主题问题,但也许是时候重新审视它们了!谢谢。如果有人知道一种简单的方法,那么弄清楚如何在 multhist 中调整情节仍然很棒。

标签: r graphics histogram plotrix


【解决方案1】:

阅读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)

这里是 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")

或者如果你真的想要像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))

【讨论】:

  • @Roland 谢谢你的回答。 ggplot2 似乎是这种直方图的好包。我也想用 multhist 解决问题,但也许用那种情节类型是不可能的!
  • @Emily 添加了如何更改multhist 中的空间。
  • 太棒了,谢谢。花了很长时间查看 barplot 帮助但找不到它!
【解决方案2】:

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

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")

【讨论】:

  • 感谢这个例子。我觉得真的很有帮助!想问一下“密度”(y轴)使用什么样的单位?
  • @Pgibas 曲线是将每个数据点转换为正态分布,然后将它们全部相加的结果as explained here。如果你找到一个简单的方法来解释它的单位,我也想知道它。XD
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多