在ggplot中,histgramming日期与不等的区间

时间:2012-09-12 20:11:10

标签: r ggplot2

我正在尝试让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个月宽)的垃圾箱。

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,stat_bin将允许指定bin边缘。但是在使用日期时,通常情况下必须手工将价值转化为内部规模。另外,在您的第二个示例中,您同时拥有geom_barstat_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))

enter image description here

请注意,我已将breaks参数包含在stat_bin的{​​{1}}中。另外,我向as.numeric添加了一个position="identity"参数,以消除关于不相等的bin宽度的警告(因为只有一个组,它不需要与任何东西堆叠)。