【R備忘録】ggplotで横軸が連続値のgeom_barをうまくstackできない

次のようなdatetimeのデータがあって、時系列でどのように分布しているのかを調べたいとします。

#R
datetime
## [1] "2016-07-18 08:20:00 UTC" "2016-08-31 08:20:00 UTC" "2016-07-18 08:30:00 UTC" "2016-08-31 08:30:00 UTC"
## [5] "2016-07-18 08:40:00 UTC" "2016-08-31 08:40:00 UTC" "2017-03-22 08:40:00 UTC" "2016-07-18 08:50:00 UTC"
## [9] "2016-08-31 08:50:00 UTC" "2017-03-22 08:50:00 UTC" "2016-07-18 09:00:00 UTC" "2016-08-31 09:00:00 UTC"
##[13] "2017-03-22 09:00:00 UTC" "2016-07-18 09:10:00 UTC" "2016-08-31 09:10:00 UTC" "2017-03-22 09:10:00 UTC"
##[17] "2018-03-23 09:10:00 UTC" "2016-07-18 09:20:00 UTC" "2016-08-30 09:20:00 UTC" "2016-08-31 09:20:00 UTC"
##[21] "2017-01-03 09:20:00 UTC" "2017-03-22 09:20:00 UTC" "2018-03-23 09:20:00 UTC" "2016-07-18 09:30:00 UTC"
##[25] "2016-08-30 09:30:00 UTC" "2016-08-31 09:30:00 UTC" "2017-01-03 09:30:00 UTC" "2017-03-22 09:30:00 UTC"
##[29] "2018-03-23 09:30:00 UTC" "2016-07-31 09:40:00 UTC" "2016-08-31 09:40:00 UTC" "2017-01-03 09:40:00 UTC"
##[33] "2017-03-22 09:40:00 UTC" "2016-07-31 09:50:00 UTC" "2016-08-31 09:50:00 UTC" "2017-01-03 09:50:00 UTC"
##[37] "2017-03-22 09:50:00 UTC" "2016-07-31 10:00:00 UTC" "2017-03-22 10:00:00 UTC" "2017-03-22 10:10:00 UTC"

当然、棒グラフを書きたい。
期間が複数年にわたっているため、横軸は年月にします。

library(tidyverse)
library(lubridate)

tibble(
  dt = datetime,
  ym = floor_date(datetime, "month")
) %>%
ggplot(aes(ym)) + geom_bar()

これは問題ありません。
ここからさらに時間帯の分布を調べるために、色分けして積み上げ棒グラフにします。
積み上げにしたいのだから、時間を離散値(factor)にするのを忘れずに。

tibble(
  dt = datetime,
  ym = floor_date(datetime, "month")
) %>%
mutate(hour = factor(hour(datetime))) %>%
ggplot(aes(ym)) 
 + geom_bar(aes(fill = hour))
## Warning message:
## position_stack requires non-overlapping x intervals

8,9,10時が含まれているということはわかりましたが、10時のデータがうまく積み上げられていません。
横軸が連続値であることから、8,9時のデータと10時とのデータが積み上げるべき同一軸上の値だと認識できていないのが原因です。
これは次のように、棒の幅を指定することで回避できます。

tibble(
  dt = datetime,
  ym = floor_date(datetime, "month")
) %>%
mutate(hour = factor(hour(datetime))) %>%
ggplot(aes(ym)) 
 + geom_bar(aes(fill = hour), width = 2000000)


横軸がdatetimeで単位が秒ですので、棒の幅を2000000秒(23日くらい)に指定しています。

そもそも連続軸で棒グラフを書こうというのに無茶があるといえばまあその通りではあるのですが、真面目に離散値にしようとすればグラフを描画するためだけに横軸のマスタを作らなければならなくなるので、このように簡易的にできることにもそれなりに意味はあるでしょう。

参考

コメントを残す