理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

gnuplotでグラフをアニメーション表示する方法

この技確かgnuplotのdemoに入ってたんだけど、なんかやってみて、見せてみたら,結構ウケが良かったので紹介してみるテスト。

やってみた理由

シミュレーションとかで,各時間毎のグラフを取ってその推移をみたい場合,アニメーションとかで見たら超便利で超わかりやすいかもとか妄想してみた。特にグラフを重ねるとすごい分かりにくくなって「しねばいいのに」とか言いたくなる3Dの場合とか、あるいは等高線図的な(pm3d mapを使うときとか)、3次元を2次元に投影するグラフを書きたいときにステキかも。

やりかた(3Dの場合の例)

とりあえずこんなフォーマットのデータファイルを作る。よくある3D表示用のフォーマットで、各時間のデータは空白2行で分割します(後でindex指定を使うため)

### This file is "hoge.dat"
# time=0
1   1    10
.....
1  10    30

2   1     1
2   2    30
......

10  9    30
10 10     4


# time=10
# おんなじ感じ

gnuplot使って、各種設定をしたあと、とりあえず最初のグラフでも作ってみる。

# このあたりの設定はおこのみで。
set xlabel "hoge"
set ylabel "hogehoge"
set ticslevel 0
set pm3d map  
# 略
splot "hoge.dat" index 0 ti "" w pm3d

グラフ描けたらとりあえずセーブでもします。

save "hoge.gp"

エディタとかで、hoge.gpの最後あたりにあるsplotの文をこんな風に変更

idx=idx+1
splot "dat" index idx ti "" w pm3d
pause 0.25 
if( idx < 200 ) reread # 200は用意した用意したインデックスの最大値とかでよろしゅう。

で、修正したdat.saveをgnuplotに食わせると、もこもことグラフが動き出します。ただ、上のようなセーブをする前か、このファイルをロードする前で、idxを定義しとかないと、gnuplotにエラーです死ねっていわれる。

idx=0 # 定義
load "hoge.gp"

原理はとても簡単なので、すぐに応用が効くんじゃないかとおもいます。index指定じゃなくてusingで指定するとかとか。もちろんスクリプトとか書いて、パイプでgnuplotに流しこんでもいける。グラフが動くのは気持ちわるいけどちょっと便利。でも気持ちわるい。