Rで地図を描画するのは容易ですが、アニメーションを作るには、少々コツが必要です。以前は手動でやっていたのですが、mapmateという便利なライブラリがあったので使ってみました。
mapmate の概要
Rのggplot2を利用して地図を作ってそれをアニメーションにするのはよくやることですが、結構コツが必要です。具体的には、地図を表示する際のサイズの設定や解像度、中間ファイルの出力方法など、標準的ではない使い方をしながら、プロダクションを進めないといけません。mapmateではいわゆる現像にあたる部分をほぼ自動化して、かつ、おしゃれな可視化をインスタントにすることが可能です。
Matthew Leonawiczさんという方が作られているようで、まだメンテはされているようです。University of Alaska Fairbanks で統計関係の仕事をしているようです。
インストール
以下のようにすればOKです。CRANには入っていないようです。
install.packages("devtools")
devtools::install_github("leonawicz/rvtable")
使い方(静止画)
lat,lonがあるdata.frameについて、frameIDというカラムを追加すれば、即座に出力可能です。
サンプルではmaptilesというラスタイメージを表示しています。orthoをTRUEにすると地球儀が表示されます。
library(mapmate)
library(dplyr)
data(annualtemps)
library(RColorBrewer)
pal <- rev(brewer.pal(11, "RdYlBu"))
temps <- mutate(annualtemps, frameID = Year - min(Year) + 1)
frame1 <- filter(temps, frameID == 1) # subset to first frame
id <- "frameID"
save_map(frame1, z.name = "z", id = id, ortho = FALSE, col = pal, type = "maptiles",
save.plot = FALSE, return.plot = TRUE)
save_map(frame1, z.name = "z", id = id, col = pal, type = "maptiles", save.plot = FALSE,
return.plot = TRUE)
使い方(動画)
静止画なら別にggplotなどを使えばよいので、上記のラッパーを使う意味はあまりありません。動画を作ってみましょう。
こちらコードサンプルにあるように、animate関数を使って、生成される画像列を結合すればよいのですが、以下のように画像シーケンスを作るための関数が用意されています。
gglist <- save_seq(paths_flat, id = "id", n.frames = n, ortho = FALSE, type = "network",
ylim = ylm, png.args = png.args, save.plot = FALSE, return.plot = TRUE)
アニメーション化は以下のようにanimationパッケージで行います。
library(animation)
ani.options(convert = "C:/Program Files/ImageMagick-7.0.6-Q16/convert.exe")
saveGIF(for (i in seq_along(gglist)) print(gglist[[i]]), "network2D.gif", interval = 1/20, ani.width = 960, ani.height = 480)
これで非常に簡単に、以下のようなアニメーションが可能になります。
ImageMagickを使っているので、gifアニメーション以外も可能なようですから、活用範囲が広がりそうです。