日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

シミュレートの結果を動画で確認したい?

実はこれ、R Advent Calender用に準備していた日記です。
で・す・がhoxo_mさんのR advent Calenderで紹介されてしてしまっていたようで…
まさに早い者勝ち、弱肉強食ですね…

ということで、公開することにしました。
パラメータをいろいろ変えて、その状態遷移を見た時期があります。
そうなると、条件毎に数値が羅列される訳ですが、数字の羅列ってものは直感的じゃないので嫌いです。
image関数を少し変えてカラーパターンで判別することを、これまで続けていたのですが、「ちょっと、ちょっと、インク代と紙代が勿体ない!!」って思うようになりました。
そこで、目をつけたのがanimationパッケージです。

  • animationパッケージ

その名の通り、動画を作成するパッケージです。
動画は静止画の集まり、ってことで複数の画像をパラパラマンがの容量で俯瞰できます。

ただ、利用には条件があって、使用する関数毎に、ソフトウェアのインストールが必要です。
Rはグラフを作成するところまでで、画像にまとめるところは外部に任せているところが、いかにもRらしい。

SystemRequirements:
ImageMagick (http://imagemagick.org) or GraphicsMagick (http://www.graphicsmagick.org) or LyX (http://www.lyx.org) for saveGIF()
(PDF)LaTeX for saveLatex()
SWF Tools (http://swftools.org) for saveSWF()
FFmpeg (http://ffmpeg.org) for saveVideo()

CRAN - Package animation

私はImageMagicとFFmpegが使い慣れているんで、GIF形式とmp3形式が使用頻度高そうです。

    • saveVideo関数

これはmp3形式とavi形式に対応する関数

> library(animation)
> # ffmpegの絶対パスを通す
> oopts = ani.options(ffmpeg = "/usr/bin/ffmpeg")
> #oopts = ani.options(ffmpeg = "c:/ffmpeg/bin/ffmpeg.exe") # windowsだとこんな 感じ
> 
> saveVideo({
+ par(mar = c(3, 3, 1, 0.5), mgp = c(2, 0.5, 0), tcl = -0.3, cex.axis = 0.8, cex.lab = 0.8, cex.main = 1)
+ # 画像の切り変わるスピードを調整
+ ani.options(interval=.5, nmax=1000)
+ for(i in c(1:50,49:1)){
+ y <- x <- seq(-i, i, length= 50)
+ z <- outer(x, y, function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r })
+ persp(x, y, z, theta=30, phi=30, expand=0.5, col=terrain.colors(50), border=NA)
+ }
+ }, video.name = "test.mp4", other.opts = "-b 600k")
> # パスを指定しないとtmpに出力され、絶対パス指定するとエラーが出つつも指定したパスにファイルができる

ani.options関数は?saveVideoで分かるように、引数ffmpeg="ffmpeg"でも指定できます。
で、こんな感じ

    • saveMovie関数

saveGIF関数と同じく、gif形式に対応します。

> saveMovie({
+ par(mar = c(3, 3, 1, 0.5), mgp = c(2, 0.5, 0), tcl = -0.3, cex.axis = 0.8, cex.lab = 0.8, cex.main = 1)
+ for(i in c(1:50,49:1)){
+ y <- x <- seq(-i, i, length= 50)
+ z <- outer(x, y, function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r })
+ persp(x, y, z, theta=30, phi=30, expand=0.5, col=terrain.colors(50), border=NA)
+ }
+ }, movie.name = "test.gif", interval = 0.1, nmax = 30, ani.width = 600, ani.height = 600)

で、こんな感じ

    • saveSWF

onericではSWFToolsがapt-get installできないので、ここを参考にインストールしました。
こんなかんじで。

$ sudo apt-get install zlib1g-dev libgif-dev libfreetype6-dev libjpeg62-dev
$ wget http://swftools.org/swftools-0.9.1.tar.gz
$ tar -zvxf swftools-0.9.1.tar.gz
$ cd swftools-0.9.1/
$ ./configure
$ make
$ sudo make install

で、

> saveSWF({
+ par(mar = c(3, 3, 1, 0.5), mgp = c(2, 0.5, 0), tcl = -0.3, cex.axis = 0.8, cex.lab = 0.8, cex.main = 1)
+ for(i in c(1:10,9:1)){
+ y <- x <- seq(-i, i, length= 50)
+ z <- outer(x, y, function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r })
+ persp(x, y, z, theta=30, phi=30, expand=0.5, col=terrain.colors(50), border=NA)
+ }
+ }, swf.name = "test.swf", interval = 0.2, nmax = 30, ani.dev = "pdf", ani.type = "pdf", ani.height = 6, ani.width = 6)

ですが、どうもFlashはできているのですが、VLCで再生できませんでした。きっとこれは、端末の問題なんでしょう。
ということで、動画アップは諦めました。