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してみた。手順としてはかなり強引だが

  1. 元のデータ(y)を行列からベクトルに直す(Value列)
  2. 元のデータを対応付けられる様にそれぞれのデータに固有のGoupID(この場合は1からの整数連番)を振る(Group列)
  3. 日付をデータ系列分繰り返す(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")

描画結果はこんなかんじ。結構イケてる。あとは配色を決めている「Group」変数の割り振りをもう少し考えればOKかな。