シミュレートの結果を動画で確認したい?
実はこれ、R Advent Calender用に準備していた日記です。
で・す・が、hoxo_mさんのR advent Calenderで紹介されてしてしまっていたようで…
まさに早い者勝ち、弱肉強食ですね…
ということで、公開することにしました。
パラメータをいろいろ変えて、その状態遷移を見た時期があります。
そうなると、条件毎に数値が羅列される訳ですが、数字の羅列ってものは直感的じゃないので嫌いです。
image関数を少し変えてカラーパターンで判別することを、これまで続けていたのですが、「ちょっと、ちょっと、インク代と紙代が勿体ない!!」って思うようになりました。
そこで、目をつけたのがanimationパッケージです。
- animationパッケージ
その名の通り、動画を作成するパッケージです。
動画は静止画の集まり、ってことで複数の画像をパラパラマンがの容量で俯瞰できます。
ただ、利用には条件があって、使用する関数毎に、ソフトウェアのインストールが必要です。
Rはグラフを作成するところまでで、画像にまとめるところは外部に任せているところが、いかにもRらしい。
SystemRequirements:
CRAN - Package animation
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()
私は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で再生できませんでした。きっとこれは、端末の問題なんでしょう。
ということで、動画アップは諦めました。