5

ggplot で 3 か月幅のビンを持つヒストグラムを作成しようとしています。90日じゃなくて3ヶ月。日数に関しては、これは不等幅ビニングです。3 か月間隔の目盛りは正常に機能することに注意してください。私が問題を抱えているのはビンの幅です。ここでかなりの議論がありましたが、解決策が見つかりませんでした。

日付を理解し、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ように、ビンのエッジを指定できるようになります。ただし、日付を操作する場合、操作するには値を手動で内部スケールに変換する必要がある場合がよくあります。また、2番目の例では、2つの異なるレイヤーをプロットしている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_binでラップしていることに注意してくださいas.numeric。また、ビンの幅が等しくないという警告を排除するためのposition="identity"引数を追加しましたstat_bin(グループは1つしかないため、何もスタックする必要はありません)。

于 2012-09-14T18:53:02.100 に答える