アニメーション

作成者:上道 賢太

gnuplotではループ機能を使うことができるので,少しずつ動かしながら表示してアニメーションを作ることができます.
また,グラフをPNG形式などで出力することができるので, 連番でグラフを出力し,繋げてぱらぱら漫画の要領でアニメーションにすることもできます.


・ループによる描画

if (exist("i") == 0 || i < 0) i = 0     #もしiが定義されていない,もしくはi<0の時,i=0と定義
 set title "animation"     #titleの設定
 time = sprintf("t=%d",i)     #ステップ数をtimeと定義
 set label time at 7,0.7     #timeで定義したものを7,0.7の座標に表示
 plot sin(x-i)     #グラフプロット
 i = i + 1     #カウントアップ
 pause 0.1     #停止時間の調整
 reset     #setしたものをリセット
if(i <= 100) reread     #100まで繰り返す
i = -1     #終了後iを-1にする

これをsin.txtとして保存し(拡張子は何でもよい)gnuplotでloadすると

$gnuplot > load "sin.txt"

以下のようなアニメーションが新しいウィンドウで開かれます。

・連番のPNG画像を作る

次は,PNG形式で出力してぱらぱら漫画を作ります.できたPNG画像はフリーソフトなどで繋げてアニメーションにします.

if (exist("i") == 0 || i < 0) i = 0          #もしiが定義されていない,もしくはi<0の時,i=0と定義
  set title "animation"          #titleの設定
  time = sprintf("t=%d",i)          #ステップ数をtimeと定義
  set label time at 7,0.7         #timeで定義したものを7,0.7の座標に表示
  set term png         #terminalをpngに設定
  filename = sprintf("./ani%03d.png",i)         #filenameの設定(001.png,002.png,・・・と出力)
  set output filename          #出力
  plot sin(x-i)          #グラフプロット
  set output      #必要ないかも
  i = i + 1          #カウントアップ
  pause 0.01          #停止時間
  reset          #setしたものをリセット
if(i <= 100) reread          #100まで繰り返す
i = -1          #終了後iを-1にする

・連番の画像をアニメーションにする

Windowsを使用している場合はgiamという便利なソフトがあります.
また,コマンドラインで行なう場合にはmencoderが便利です.

$mencoder "mf://./*.png" -mf fps=40 -ovc lavc -lavcopts vcodec=mpeg4 -o ./movie.avi

カレントディレクトリの拡張子がpngのものすべてをfps=40で繋いでくれる.ビデオコーデックはmpeg4を指定している.