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"))
その他、色々と付け足していけば、思いどおりのプロットができるでしょう。しかし、本題はデータを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
matplotならばどうかというと、xtsプロットの良い部分は完全に失われます。
> matplot(rate_xts, type = "l")
xtsはzooクラスとしても扱えるのだから、plot.zooで良い感じにプロットされるのではないかと思い、やってみるとmatplotとほぼ変わりません…
> plot.zoo(rate_xts, plot.type = "single")
というところまで試してみて、CRANには上がっていないxtsExtraを使うのが一番良さそうということが分かり、使ってみるとxtsプロットの良い部分もあり、matplotのような複数系列のプロットが簡単にできました。
library(devtools) devtools::install_github("joshuaulrich/xtsExtra") library(xtsExtra) plot(rate_xts, col = 1:15)
ただ、デフォルトでplotするだけでは12系列までしかプロットされないようなので、色の指定を系列数分に増やす、または、addSeriesを使って追加する必要があるようです。matplotしたものの軸ラベル等をxtsプロット風に頑張って変更するよりも、断然xtsExtraを使うのが良さそうです。