Note of Pediatric Surgery

腸内細菌、R、ときどき小児外科

ggplot2で開始と終了がある期間データを帯グラフで表現する

はじめに

今度の学会で外来患者の長期フォローアップをまとめて発表します。そこでggplot2で開始日付 ( 初診日 ) と終了日付 ( 最終受診日 ) のあるデータの期間を、帯グラフで表現したかったのですが、日本語でのまとまった記事がなかったので書いてみました。StackOverflowの記事から参考に書きます。

stackoverflow.com

最終的にはこのようなグラフを書けることを目標にします。結論からすると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 !