5

我试图让 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))

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

4

1 回答 1

3

正如您所注意到的,stat_bin将允许指定 bin 边缘。但在处理日期时,往往需要手动将值转换为内部刻度才能工作。此外,在您的第二个示例中,您同时拥有 ageom_bar和 a 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_binin as.numeric。另外,我添加了一个position="identity"参数来stat_bin消除关于不等箱宽度的警告(因为只有一个组,它不需要与任何东西堆叠)。

于 2012-09-14T18:53:02.100 回答