ggplot2で開始と終了がある期間データを帯グラフで表現する
はじめに
今度の学会で外来患者の長期フォローアップをまとめて発表します。そこでggplot2で開始日付 ( 初診日 ) と終了日付 ( 最終受診日 ) のあるデータの期間を、帯グラフで表現したかったのですが、日本語でのまとまった記事がなかったので書いてみました。StackOverflowの記事から参考に書きます。
最終的にはこのようなグラフを書けることを目標にします。結論からするとgeomline()で普通にかけるんですが…すみません。
データセットの作成
tasks <- c("Meetings", "Client Calls", "Design", "Bidding", "Construction") dfr <- data.frame( name = factor(tasks, levels = tasks), start.date = c("07/08/2013", "07/08/2013", "07/23/2013", "08/30/2013", "9/30/2013"), end.date = c("07/12/2013", "07/13/2013", "08/15/2013", "09/12/2013", "12/01/2013"), is.critical = c(TRUE, FALSE, TRUE, TRUE, TRUE))
> dfr name start.date end.date is.critical 1 Meetings 07/08/2013 07/12/2013 TRUE 2 Client Calls 07/08/2013 07/13/2013 FALSE 3 Design 07/23/2013 08/15/2013 TRUE 4 Bidding 08/30/2013 09/12/2013 TRUE 5 Construction 9/30/2013 12/01/2013 TRUE
ミーティング、クライアントからの電話、デザイン、入札、建築の開始日と終了日がデータに格納されていることがわかります。
データを成型する
library(reshape2) mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))
どうやらLong型のデータの方が扱いやすいようです。
mdfr$time <- as.POSIXct(strptime(mdfr$value,"%m/%d/%Y"))
ここが大事な作業。POSIXctというクラスを初めてみたのですが、RjpWikiによると、POSIXctとは1970年元旦からの符号付き経過秒のことだそうで。 ( それより以前はどうなっちゃうんだろう? ) どういったデータなのか実際に展開してみると
> as.POSIXct(strptime(mdfr$value,"%m/%d/%Y")) [1] "2013-07-08 JST" "2013-07-08 JST" "2013-07-23 JST" "2013-08-30 JST" "2013-09-30 JST" "2013-07-12 JST" [7] "2013-07-13 JST" "2013-08-15 JST" "2013-09-12 JST" "2013-12-01 JST"
という感じです。出来上がったデータを確認すると
kable(mdfr, align="c")
name | is.critical | variable | value | time |
---|---|---|---|---|
Meetings | TRUE | start.date | 07/08/2013 | 2013-07-08 |
Client Calls | FALSE | start.date | 07/08/2013 | 2013-07-08 |
Design | TRUE | start.date | 07/23/2013 | 2013-07-23 |
Bidding | TRUE | start.date | 08/30/2013 | 2013-08-30 |
Construction | TRUE | start.date | 9/30/2013 | 2013-09-30 |
Meetings | TRUE | end.date | 07/12/2013 | 2013-07-12 |
Client Calls | FALSE | end.date | 07/13/2013 | 2013-07-13 |
Design | TRUE | end.date | 08/15/2013 | 2013-08-15 |
Bidding | TRUE | end.date | 09/12/2013 | 2013-09-12 |
Construction | TRUE | end.date | 12/01/2013 | 2013-12-01 |
こういうデータが成型できれば良いようです。
グラフを描く
install.packages("scales") library(scales)
{scales}はからだにいいものによると
カラーパレットの作成だけでなく、文字列の表示形式や連続・離散スケールの管理が簡単な「scalesパッケージ」を紹介します。連続・離散スケールの管理コマンドを使うと、plotコマンドだけではなくggplot2パッケージでも軸やスケールの調整が楽になると思います。
というパッケージだそうです。あとはgeom_line()を太めにサイズを設定して描けばよいようです。
ggplot(mdfr, aes(x=time, y=name, colour=is.critical)) + geom_line(size = 6) + xlab("") + ylab("")+ labs(title="Sample Project Progress")+ theme_bw()+ scale_x_datetime(date_breaks="30 days")
これでこんなグラフが描けると思います。Enjoy !