今週も特にありません

進捗どうですか?

xtsでmatplotのようなプロット

最近はdplyrやtidyrとの相性で、ほぼggplot2を使うようになり、めっきりmatplotを使う機会が無くなってきています。

しかし、時系列データを扱う際にdata.frameよりもxtsを使いたい場合もあり、その時にxtsのままでmatplotのような感じのプロットするにはどうするのがいいのか?と思っていたので調べたメモします。結局、xtsとxtsExtraをセットで使うのが良さそうということがわかりました。

まず、データとして、複数時系列データをQuandlから取ってきます。この時に、Quandl関数でtypeにxtsを指定すれば、xtsクラスでデータを取って来れますが、一旦、ggplot2でプロットするためにdata.frameで取って来ることにします。

library(Quandl)

rate_df <- Quandl("MOFJ/INTEREST_RATE_JAPAN", trim_start = "2015-01-01")

このデータをggplot2でプロットします。

library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)

rate_df %>% gather(maturity, rate, -Date) %>% 
  ggplot(aes(x = Date, y = rate, colour = maturity)) + geom_line(size = 1) +
  scale_x_date(labels = date_format("%m/%d"))

f:id:masaqol:20151206233544p:plain

その他、色々と付け足していけば、思いどおりのプロットができるでしょう。しかし、本題はデータをdata.frameではなくxtsクラスで扱いたい場合です。まわりくどいですが、Quandlの中でやっている処理と同じようにdata.frameからxtsに変換します。

rate_xts <- xts(rate_df[, -1], order.by = rate_df[, 1])

ここで、そのままplotすれば複数系列を一辺にプロットしてくれると思いきや、警告メッセージとともに残念なプロットがされます。

> plot(rate_xts)
Warning message:
In plot.xts(rate_xts) : only the univariate series will be plotted

f:id:masaqol:20151206234012p:plain

matplotならばどうかというと、xtsプロットの良い部分は完全に失われます。

> matplot(rate_xts, type = "l")

f:id:masaqol:20151206234802p:plain

xtsはzooクラスとしても扱えるのだから、plot.zooで良い感じにプロットされるのではないかと思い、やってみるとmatplotとほぼ変わりません…

> plot.zoo(rate_xts, plot.type = "single")

f:id:masaqol:20151206235744p:plain

というところまで試してみて、CRANには上がっていないxtsExtraを使うのが一番良さそうということが分かり、使ってみるとxtsプロットの良い部分もあり、matplotのような複数系列のプロットが簡単にできました。

library(devtools)
devtools::install_github("joshuaulrich/xtsExtra")
library(xtsExtra)

plot(rate_xts, col = 1:15)

f:id:masaqol:20151207004738p:plain

ただ、デフォルトでplotするだけでは12系列までしかプロットされないようなので、色の指定を系列数分に増やす、または、addSeriesを使って追加する必要があるようです。matplotしたものの軸ラベル等をxtsプロット風に頑張って変更するよりも、断然xtsExtraを使うのが良さそうです。