Rで書かれた2012カレンダーの中身

はじめに

最近R言語について調べていてCalendaR 2012 with ggplot2という記事を見つけました.どうやったらこんなことができるのかわからなかったので中身を追いかけてみたメモです.

行ごとの解説

library(ggplot2)
year <- 2012

ggplot2という画像ライブラリを呼び込んで,変数yearに2012をセットしています.これは簡単.

d <- seq.Date(as.Date(paste(year, "-01-01", sep = "")), 
 as.Date(paste(year, "-12-31", sep = "")), by="days")
z <- data.frame(Y = format(d, "%Y"), M = as.numeric(format(d, "%m")),
 D = as.numeric(format(d, "%d")), W = format(d, "%w"))

dに"2012-01-01"から"2012-12-31"までのDateオブジェクトのシーケンスを作ります.zには年,月,日,曜日を一つの要素としたデータフレームを作っています.それぞれの先頭二つのデータは以下のようになっています.

> d[1]
[1] "2012-01-01"
> d[2]
[1] "2012-01-02"
> z[1,]
     Y M D W
1 2012 1 1 0
> z[2,]
     Y M D W
2 2012 1 2 1

カレンダーに使うデータはこれだけで,後は図示するためのしくみです.

c <- ggplot(z, aes(D, M))

zオブジェクトのデータを横軸を日(D),縦軸を月(M)で表示する宣言.

c + geom_text(aes(label=z$D, colour=factor(W), size = 20))

日(z$D)をラベルとして曜日(W)に基づいた色を使います.サイズは20,う,単位は何だろう.

+ scale_colour_manual(values = c("magenta", rep("black", 5),"darkturquoise"))

日曜日(0)がマジェンタ,月曜から金曜までの5日間は黒,土曜はダークターコイズ.

+ scale_y_continuous(trans = "reverse", breaks = 1:12)

通常だと縦軸が下から1,2,3になるので,カレンダーとして使うために上から1,2,3になるようにしてる.

+ labs(x="", y="")
+ opts(title = paste("CalendaR", year, "\n", sep = " "),
plot.title = theme_text(colour = "black"),
legend.position = "none"
)

縦横のラベルを消して,表題を付けて,曜日ごとの色の説明を消してる(legend.position).

おまけ

単に調べただけでは面白くないので,カレンダーに休日を追加してみました.Wには曜日にあたる0〜6までの数字が入っているのですが,休日用に7を追加します.データフレームを置き換えるを参考にしました.

levels(z$W)<-c(levels(z$W),7)
z[z$Y==2012 & z$M==1 & z$D==1,]<-list(2012,1,1,7)
z[z$Y==2012 & z$M==1 & z$D==2,]<-list(2012,1,2,7)
z[z$Y==2012 & z$M==1 & z$D==9,]<-list(2012,1,9,7)
z[z$Y==2012 & z$M==2 & z$D==11,]<-list(2012,2,11,7)
z[z$Y==2012 & z$M==3 & z$D==20,]<-list(2012,3,20,7)
z[z$Y==2012 & z$M==4 & z$D==29,]<-list(2012,4,29,7)
z[z$Y==2012 & z$M==4 & z$D==30,]<-list(2012,4,30,7)
z[z$Y==2012 & z$M==5 & z$D==3,]<-list(2012,5,3,7)
z[z$Y==2012 & z$M==5 & z$D==4,]<-list(2012,5,4,7)
z[z$Y==2012 & z$M==5 & z$D==5,]<-list(2012,5,5,7)
z[z$Y==2012 & z$M==7 & z$D==16,]<-list(2012,7,16,7)
z[z$Y==2012 & z$M==9 & z$D==17,]<-list(2012,9,17,7)
z[z$Y==2012 & z$M==9 & z$D==22,]<-list(2012,9,22,7)
z[z$Y==2012 & z$M==10 & z$D==8,]<-list(2012,10,8,7)
z[z$Y==2012 & z$M==11 & z$D==3,]<-list(2012,11,3,7)
z[z$Y==2012 & z$M==11 & z$D==23,]<-list(2012,11,23,7)
z[z$Y==2012 & z$M==12 & z$D==23,]<-list(2012,12,23,7)
z[z$Y==2012 & z$M==12 & z$D==24,]<-list(2012,12,24,7)

後は表示の色を細工すれば完成です.

scale_colour_manual(values = c("magenta", rep("black", 5),"red","chocolate"))

動かしてみると,こんなカレンダーができあがります.