Never Too Late

いつだってゼロからやり直そう

ggplot2を使ってガントチャートを描く

ggplot2を使ってガントチャートを描いてみます。ガントチャートは、プロジェクトを進行する際の複数タスクの関連を図示するとき等によく使われるチャートです。

まずこのようなデータフレームを用意します。

Task Date Type
A 2020-01-01 Start
A 2020-01-05 End
B 2020-01-06 Start
B 2020-01-15 End
C 2020-01-04 Start
C 2020-01-12 End
A 2020-01-13 Start
A 2020-01-20 End
B 2020-01-18 Start
B 2020-01-22 End

ご覧の通り、それぞれのタスクごとに始まりの日付と終わりの日付をそれぞれひとつのレコードとして保持します。終わったタスクが再度始まるケースも想定しています、というかそれがなければ話はずっと単純です。

次に以下の処理で各タスクのStart-Endペアごとに番号を振っていきます。

library(dplyr)

df %<>%
  arrange(Task, Date) %>%
  group_by(Task, Type) %>%
  mutate(TaskSeq = row_number())

これでデータフレームの中身はこのようになります。

Task Date Type TaskSeq
A 2020-01-01 Start 1
A 2020-01-05 End 1
A 2020-01-13 Start 2
A 2020-01-20 End 2
B 2020-01-06 Start 1
B 2020-01-15 End 1
B 2020-01-18 Start 2
B 2020-01-22 End 2
C 2020-01-04 Start 1
C 2020-01-12 End 1

ループを使い、このデータフレームをTaskSeqごとにgeom_line()を使って図示していきます。

library(ggplot2)

gp <- ggplot()
for(seq in 1:max(df$TaskSeq)){
  gp <- gp +
    geom_line(data = subset(df, TaskSeq == seq),
              aes(x = Date,
                  y = Task,
                  color = Task),
              size = 5)
}
print(gp)

ガントチャートが図示できました。

f:id:rintaromasuda:20200323215755j:plain