ggplo2で時系列(単系列・複数系列)を描画したい
単系列編
とりあえずのサンプルデータ
x <- data.frame(Date=Sys.Date()+1:10, Value=rnorm(10))
これをPLOTするには以下のようにするのが良さげかな。
scalesパッケージは日付のフォーマットいじり(date_format関数)をするのに必要だとの事。
library(scales) library(ggplot2) ggplot(x, aes(Date, Value)) + geom_line() + scale_x_date(labels = date_format("%m/%d")) + xlab("") + ylab("Value")
複数系列編
ggplot2でmatplot関数のように複数時系列を一枚にPLOTする方法はややめんどかった。
使用するサンプルデータは次のようにxtsオブジェクトにcodadata & index関数をかませた出力を想定。
SIZE.DATA <- 100 SIZE.SERIES <- 10 x <- Sys.Date()+1:SIZE.DATA y <- apply(matrix(rnorm(SIZE.SERIES * SIZE.DATA), nrow=SIZE.DATA,ncol=SIZE.SERIES),2,cumsum)
実際には以下のようなデータです。
> head(x) [1] "2012-07-29" "2012-07-30" "2012-07-31" "2012-08-01" "2012-08-02" "2012-08-03" > head(y) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] 0.1932413 -1.349773 0.88362237 0.1206253 -1.215115 0.58045834 -0.2578560 [2,] -2.1366600 -2.504545 0.68110412 0.6646157 -0.404405 1.26274669 -0.6459771 [3,] -2.5839983 -2.848815 0.37849465 1.9909576 -1.182589 1.48175691 -0.7462040 [4,] -4.1792746 -2.542682 -0.06005983 1.5662871 -2.276329 1.30554089 -0.4112450 [5,] -4.7904577 -3.118942 0.66876746 1.8950629 -3.653549 0.00298904 1.6708051 [6,] -6.4609273 -3.376656 0.73312995 2.7664571 -2.987028 -1.46264583 1.9444279 [,8] [,9] [,10] [1,] 1.0664366 -0.1115965 -0.1884074 [2,] 2.5494148 -0.6472976 -0.3861175 [3,] 0.6532883 0.0840428 -0.6558017 [4,] 0.9201912 0.4249140 -0.4159059 [5,] 1.2883420 -0.1676027 -1.5428658 [6,] 1.6829543 -0.2923940 -2.3572562
これを以下のように処理することで時系列PLOTしてみた。手順としてはかなり強引だが
- 元のデータ(y)を行列からベクトルに直す(Value列)
- 元のデータを対応付けられる様にそれぞれのデータに固有のGoupID(この場合は1からの整数連番)を振る(Group列)
- 日付をデータ系列分繰り返す(Date列)
としたものを1つのデータフレーム(Date, Value, Group)として、Groupごとに色が異なる様にPLOTさせて実行している。
data.plotted <- data.frame(Date=rep(x,ncol(y)), Value=as.numeric(y), Group=rep(1:ncol(y), each=nrow(y))) ggplot(data.plotted, aes(Date, Value, group=Group)) + geom_line(aes(colour = Group)) + scale_x_date(labels = date_format("%m/%d")) + opts(legend.position="none") + xlab("") + ylab("Value")