gnuplotでアニメーショングラフの作成 : rereadコマンド
ここまでいくつかgnuplotでアニメーションするグラフを作成する方法を解説してきました。
以上はループ処理に絡めた説明だったわけですが、今回は説明を後回しにしていたrereadコマンドを使った方法について解説していきます。公式ドキュメントやサンプルプログラムではこのrereadを使った方法が紹介されていています。
gnuplot documentation
ただアニメーションの基本から入るならまずはループ処理の説明と絡めた方がいいだろうと思いこのrereadを使う方法は後回しにしていました。
(前回までの話で少しくらい触れておいてもよかっただろうという点は反省)
のようにしてもloadでは一回読み込まれますが、その後のrereadではtest.gpファイルは読み込まれません。コマンドラインからの入力では何も起こらないためです。ではこのコマンドはどう使えばいいかというと、読み込むスクリプトファイル内に記述して用いる形となります。
イメージ図で書くとこんな感じの処理になります。test01.gpというファイル内でrereadコマンドが実行されると再度test01.gpが読み込まれ、再びrereadが実行されるとまたtest01.gpが読み込まれ…という処理がずっと続いていきます。
さて、この処理だと延々とtest01.gpが読み込まれ続けるという無限ループになってしまうので、rereadの実行判定処理を書いておいてうまく処理を終了させます。
簡単にはスクリプトファイルに
のような処理を書いておいて、ある条件に達したらrereadで読み込むのを打ち切るという使い方になります。
これを
として呼び出すとどうなるかというと、「i=0」という出力が延々と続くことになります。スクリプトファイルを見れば分かるのですが、rereadで再度読み込まれるとスクリプトファイルの一行目に「i=0」があるために毎回iの値がリセットされます。なのでiが0→1となるまでは処理が進むのですがrereadで再度読み込まれるとi=0に戻るというカタチ。
じゃあ一行目の「i=0」を無くせばいいじゃない?というとそうでもなく、一行目を無くすと
とiは変数宣言されていないですよー、となるため実行できません。
まとめると、
(まぁ公式ドキュメントとかヘルプをみると書いてあるんですけども)
要はスクリプトファイル内で変数宣言をせずに、スクリプトファイル外で宣言しておくというスタイルを取ればいいわけです。これならrereadで再度スクリプトファイルが読み込まれても変数は外部にあるためにリセットされないというわけです。
(gnuplotなのにいつまでもグラフをプロットしないまま説明してますが、もうしばらくお付き合い下さい)
ということでスクリプトファイルtest01.gpとして以下のように書きます。さっき説明したスクリプトファイルの一行目を削ったものです(pause 1は1秒ごとに実行させるための処理。無くてもよい)。
そしてこれをgnuplotのコマンドラインから以下のように呼び出します。
これでちゃんとrereadが実行されるごとにiが加算されていき、10以上で処理が終わります。要はスクリプトファイル内ではなく、外部のコマンドライン部分でiを宣言しておけばいいという考えです。
一連を動画にすると以下のようになります。
さて、振り返ってみるとこの方法ではスクリプトファイル1つだけでは完結しないことが分かります。自分がこの方法の説明を後回しにした理由の1つもそれです。つまりは方法としてやや煩雑で、実際に使うときに覚えておく手順を余計に覚えておく必要があるわけです。
とは言ってもこの方法でもちゃんとアニメーションするグラフを作成することは出来るので、方法の1つとして覚えておくといいかもです。毎回スクリプトファイルが読み込み直されるという点に着目すると便利な使い方も出来るかも?です。
最後に実際にグラフをアニメーションさせているときの動画。
gnuplot関連のブログ記事
Amazonショッピングサイト 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関連書籍など
コメント
コメントを投稿