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

Ala*_*zin 5 r ggplot2

我试图让ggplot产生一个带有3个月宽的箱子的直方图.不是90天而是3个月.就天来说,这是一个不等宽度的分组.请注意,每隔3个月的刻度线工作正常.这是我有问题的bin宽度.这里有很多讨论,但我找不到解决方案.

了解日期并使用R中的ggplot2绘制直方图

这是对问题的陈述.请注意,我显然可以在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))
Run Code Online (Sandbox Code Playgroud)

也许答案是:ggplot不会创建3个月宽(或N个月宽)的垃圾箱.

Bri*_*ggs 3

正如您所注意到的,stat_bin将允许指定 bin 边缘。但在处理日期时,通常情况下必须手动将值转换为内部比例才能工作。另外,在第二个示例中,您有 ageom_bar和 astat_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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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