gnuplotスクリプトのループ

gnuplotには幾つかのループを取り扱う方法が準備されています。一昔前のバージョンまではrereadコマンドとifコマンドを併用したループが唯一の方法でしたが、CVS版Ver.4.3以降ではplot命令やset命令の中でforというコマンドが使えるようになり、さらにより最近ではdo for ...というより一般的且つシンプルなループも使えるようになりました。

rereadとifを使ったループ

rereadはこの命令を読み込んだ時点で、現在のスクリプトファイルの始めに戻るというものです。このとき、様々な設定や変数・関数はリセットされません。

if (***) ...は条件***が真のときのみ文...を実行するものです。文...が二つ以上にわたる場合はセミコロン;で区切ります。また、文...が2行以上にわたる場合は最後の行以外の改行の前にバックスラッシュまたは円マーク\をおかなくてはなりません。

以下に簡単なループの例を示します。

if (exist("n")==0 || n<0) n=0 #変数の初期化

set samples 1000
set xrange [0:2*pi]
set yrange [-1:1]
plot cos(2*x-2.0*n*pi/30.0)*exp(-0.4*x) title sprintf("n = %d", n)

if (n<20) pause 0.1; n=n+1; \
          reread        # スクリプトの再読み込み

n=-1
#end of script

上の例では、まず1行目で変数nを初期化しています。exist("n")nという変数が定義されているかどうかを判定する関数で、もし定義されていなければ0を返します。このスクリプトを実行したとき、ループの一周目ではこのexist("n")==0またはn<0という条件が真になって、n=0という初期化が実行されます。

次にスクリプトが順に実行されていき、次のif文でもしもnが20以下であれば、0.1秒待ったあとにnがインクリメントされ、さらにrereadが実行されてスクリプトの最初に戻ります。戻ったときにはnは定義されており、かつ0以上なので、if (exist("n")==0 || n<0) n=0は実行されません。もし仮にこのif (exist("n")==0 || n<0)の条件分岐がなければrereadで戻ったときにいつもn=0が実行されてしまい、無限ループに陥ってしまいます。

スクリプトの最後には、再度スクリプトを実行する際に初期化が適切に行われるように、n=-1としておきます。もし最近のgnuplotを使っている場合はundefine nという文にして変数nを消してしまうのもいいでしょう。

このスクリプトファイルを実行すると以下のように連続してプロットが20回行われ、アニメーションのようになります。