gnuplotでアニメーショングラフの作成 : rereadコマンド

ここまでいくつかgnuplotでアニメーションするグラフを作成する方法を解説してきました。
以上はループ処理に絡めた説明だったわけですが、今回は説明を後回しにしていたrereadコマンドを使った方法について解説していきます。公式ドキュメントやサンプルプログラムではこのrereadを使った方法が紹介されていています。
gnuplot documentation

ただアニメーションの基本から入るならまずはループ処理の説明と絡めた方がいいだろうと思いこのrereadを使う方法は後回しにしていました。
(前回までの話で少しくらい触れておいてもよかっただろうという点は反省)

rereadコマンドについて

rereadコマンドはloadコマンドと似ていてどちらもスクリプトファイルを読み込むものですが、rereadの方は一度読み込まれたスクリプトファイルを再度読み込み直すというものです。ただこのコマンドは扱いがやや特殊で、コマンドラインからの実行では何も起こりません。例としてgnuplotのコマンドラインからtest.gpというファイルを読み込む場合をみると
> load "test.gp"
> reread

のようにしてもloadでは一回読み込まれますが、その後のrereadではtest.gpファイルは読み込まれません。コマンドラインからの入力では何も起こらないためです。ではこのコマンドはどう使えばいいかというと、読み込むスクリプトファイル内に記述して用いる形となります。

イメージ図で書くとこんな感じの処理になります。test01.gpというファイル内でrereadコマンドが実行されると再度test01.gpが読み込まれ、再びrereadが実行されるとまたtest01.gpが読み込まれ…という処理がずっと続いていきます。
さて、この処理だと延々とtest01.gpが読み込まれ続けるという無限ループになってしまうので、rereadの実行判定処理を書いておいてうまく処理を終了させます。
簡単にはスクリプトファイルに
i = i + 1
if (i < 10) reread

のような処理を書いておいて、ある条件に達したらrereadで読み込むのを打ち切るという使い方になります。

rereadを用いたループ処理の疑問点

さて、以上を踏まえると簡単にループ処理の一種としてスクリプトを書けそうですが、なかなかどうして簡単には行きません。例としてスクリプトファイルtest01.gpを以下のように書くとします。iを1ずつ加算して一回ずつiの値を出力するという処理。
i = 0
print "i=", i
i=i+1
if (i < 10) reread

これを
> load "test01.gp"

として呼び出すとどうなるかというと、「i=0」という出力が延々と続くことになります。スクリプトファイルを見れば分かるのですが、rereadで再度読み込まれるとスクリプトファイルの一行目に「i=0」があるために毎回iの値がリセットされます。なのでiが0→1となるまでは処理が進むのですがrereadで再度読み込まれるとi=0に戻るというカタチ。
じゃあ一行目の「i=0」を無くせばいいじゃない?というとそうでもなく、一行目を無くすと
"test01.gp", line 1: undefined variable: i

とiは変数宣言されていないですよー、となるため実行できません。
まとめると、
  • iを変数宣言すると毎回rereadで読み込み直されてしまう
  • iを変数宣言しないと実行出来ない
というジレンマが生じてしまうわけです。これ、一体どうしたらいいんでしょう???

実際に使う場合のrereadの書き方

どうしたらいいんでしょう???とネタを引きずるのも何なのでさっさとネタばらしをしていきましょう。
(まぁ公式ドキュメントとかヘルプをみると書いてあるんですけども)
要はスクリプトファイル内で変数宣言をせずに、スクリプトファイル外で宣言しておくというスタイルを取ればいいわけです。これならrereadで再度スクリプトファイルが読み込まれても変数は外部にあるためにリセットされないというわけです。

(gnuplotなのにいつまでもグラフをプロットしないまま説明してますが、もうしばらくお付き合い下さい)
ということでスクリプトファイルtest01.gpとして以下のように書きます。さっき説明したスクリプトファイルの一行目を削ったものです(pause 1は1秒ごとに実行させるための処理。無くてもよい)。
print "i=", i
pause 1
i=i+1
if (i < 10) reread

そしてこれをgnuplotのコマンドラインから以下のように呼び出します。
> i=0
> load "test01.gp"

これでちゃんとrereadが実行されるごとにiが加算されていき、10以上で処理が終わります。要はスクリプトファイル内ではなく、外部のコマンドライン部分でiを宣言しておけばいいという考えです。

一連を動画にすると以下のようになります。


さて、振り返ってみるとこの方法ではスクリプトファイル1つだけでは完結しないことが分かります。自分がこの方法の説明を後回しにした理由の1つもそれです。つまりは方法としてやや煩雑で、実際に使うときに覚えておく手順を余計に覚えておく必要があるわけです。
とは言ってもこの方法でもちゃんとアニメーションするグラフを作成することは出来るので、方法の1つとして覚えておくといいかもです。毎回スクリプトファイルが読み込み直されるという点に着目すると便利な使い方も出来るかも?です。


最後に実際にグラフをアニメーションさせているときの動画。


gnuplot関連のブログ記事


Amazonショッピングサイト gnuplot関連書籍など

コメント

スポンサーリンク


このブログの人気の投稿

gnuplotでプロットなどの色をcolornameの指定で変更する

catコマンドの出力を行番号付きにするためのコマンドラインオプション(-n, -b)

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplot : グラフにグリッド線を描く方法(set grid)

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)