我正在尝试让ggplot生成一个带有3个月宽的bin的直方图。不是90天而是3个月。就天来说,这是一个不等宽度的分组。请注意,每隔3个月的刻度线工作正常。这是我有问题的bin宽度。这里有很多讨论,但我找不到解决方案。
Understanding dates and plotting a histogram with ggplot2 in R
这是对问题的陈述。请注意,我显然可以在ggplot之外聚合结果然后绘制它们,可能作为ggplot中的因子。但我一直在寻找一个全面的ggplot解决方案。
set.seed(seed=1)
dts<-as.Date('2012-01-01') + round(365*rnorm(500))
dts<-data.frame(d=dts)
g<-ggplot(dts,aes(x=d, y=..count..))
#this isnt what I want. It is 90 days, not 3 months.
#Setting binwidth=' 3 months' also doesnt work
g + geom_histogram(fill='blue',binwidth=90) +
scale_x_date(breaks = date_breaks('3 months'), #seq(as.Date('2008-1-1'), as.Date('2012-3-1'), '3 month'),
labels = date_format("%Y-%m"),
limits = c(as.Date('2010-1-1'), as.Date('2014-1-1'))) +
opts(axis.text.x = theme_text(angle=90))
#this doesnt work either.
#get: stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
# Error in `+.Date`(left, right) : binary + is not defined for Date objects
g + geom_bar(fill='blue') +
stat_bin(breaks=seq(as.Date('2010-1-1'), as.Date('2014-1-1'), '3 month')) +
scale_x_date(breaks = date_breaks('3 months'), #seq(as.Date('2008-1-1'), as.Date('2012-3-1'), '3 month'),
labels = date_format("%Y-%m"),
limits = c(as.Date('2010-1-1'), as.Date('2014-1-1'))) +
opts(axis.text.x = theme_text(angle=90))
也许答案是:ggplot不会创建3个月宽(或N个月宽)的垃圾箱。
答案 0 :(得分:3)
正如您所注意到的,stat_bin
将允许指定bin边缘。但是在使用日期时,通常情况下必须手工将价值转化为内部规模。另外,在您的第二个示例中,您同时拥有geom_bar
和stat_bin
两个不同的图层。这是一个工作版本:
g + stat_bin(breaks=as.numeric(seq(as.Date('2010-1-1'),
as.Date('2014-1-1'), '3 month')),
fill = "blue",
position = "identity") +
scale_x_date(breaks = date_breaks('3 months'),
labels = date_format("%Y-%m"),
limits = c(as.Date('2010-1-1'), as.Date('2014-1-1'))) +
opts(axis.text.x = theme_text(angle=90))
请注意,我已将breaks
参数包含在stat_bin
的{{1}}中。另外,我向as.numeric
添加了一个position="identity"
参数,以消除关于不相等的bin宽度的警告(因为只有一个组,它不需要与任何东西堆叠)。