gnuplotでアニメーショングラフの作成 : ループ処理の基礎

以前のブログ
でグラフのGifアニメを作成するのに「do for ...」のコマンドの構文を使ったループ処理を紹介しました。gnuplotにはそれ以外にループ処理を組む方法として「while」コマンドを用いることが出来ます。
今回のブログでは、ループ処理についての基礎的な部分を見ていくことにします。あとGifアニメ以外に、アニメーションの1コマずつをファイルを出力していく方法についてもループ処理に合わせて説明していきます。

whileコマンド

ということでまずはちゃちゃっとwhileコマンドについて説明していきます。
構文の書き方は
while (ループ条件) {
コマンド文1
コマンド文2
コマンド文3

}

のようになります。ループ条件を満たしている間はずっと構文の中のコマンドがループして実行され続けるというものです。
簡単なグラフのGifアニメの作成は以下のようになります。
set term gif animate delay 1
set output "test.gif"
a = 1
while (a < 10) {
plot sin(a+x)
a=a+1
}
set output

見て分かるように、aが10以下の場合にループが実行され、「a=a+1」の処理で1ずつaが加算されていきます。そしてaが10を超えるとループが終了。終了後の最後にset outputでGifアニメの終端処理を行うという形です。
aを1ずつ加算させていくという条件なら「do for ...」の方が扱いやすいと思いますが、まぁ条件についてはいろんな指定が考えられるわけでwhileを使った方がやりやすい場合もあるでしょう。
またループ処理に関しては「continue」や「break」 コマンドも使えることを押さえておくといいです。

do forコマンド

do forについては以前のブログに書いていますが、今回はそれに補足する部分を簡単に書いておきます。。
まずdo forの条件の書き方は2つあります。1つは指定した変数に加算していく書き方。もう1つは指定した変数に文字列を入れていく書き方です。
加算していく書き方は
do for [変数 = 初期値:終了値(:増加分)]{

となります。最後の「:増加分」は1ずつ加算していく場合は書かずに省略出来ます。
文字列を代入していく方法は
do for [変数 in "文字列1 文字列2 文字列3"]{

のようにします。なおこちらはスペース区切りでそれぞれの値が分かれているので、もし文字列にスペースが含まれる場合はクォートやダブルクォートでうまいこと認識させて下さい。

あと「do for」の他に「for」を用いた「plot for うんたらかんたら 」のような書き方もあるのですが、そちらの解説はまた別の機会に回すことにします。

1コマずつを画像ファイルを出力していく方法

ここまで見てきたGifファイルの出力では1回
set output "test.gif"
と出力ファイルを出力するだけで済みましたが、1コマずつ画像ファイルを出力していくには別の方法を取る必要があります。


画像ファイルを連結して動画ファイルにするのにffmpegコマンドを用いる場合、扱う画像ファイルは
001.png, 002.png, 003.png, 004.png, 005.png ...
のように連番形式になっていると扱いやすいです。そして連番形式で出力するには1回のplot毎に出力するファイル名を変更させる処理が必要になります。

まず連番1→2→3→4→5→…についてはループ内で変数に1ずつ加算させていけば生成できます。あと連番の桁数を合わせておくようにすると後々ファイルとして扱いやすいです。3桁で出力させる場合は以下のようになるような処理が必要になります。
001→002→003→004→005→…→099→100→101→…
最後に拡張子の「.png」をそれぞれの連番に連結する処理をすることで目的の出力ファイル名の一連の組を得ることが出来ます。

このへんは数値の文字列変換や文字列連結などの処理になり、プログラミング言語ごとに扱いや書式が異なります。とりあえずgnuplotで書きやすい方法としてループ処理と合わせたスクリプトの例を書くと以下のようになります。
set term png
a=1
while (a<10){
outfile = sprintf('%03.0f.png', a)
set output outfile
plot sin(x+a)
a=a+1
}

1行目で出力端末をpngに指定します。そしてここではsprintfという関数を用いて連番文字列生成を行っています。aというループで1ずつ増える変数を「%03.0f.png」という書式変換で目的の文字列になるようにしています。キモとしては「%03.0f」が一体どういった処理を示すのかになりますが、今回は特に説明はしないので必要に応じて調べてみて下さい。以上のスクリプトを実行するとカレントディレクトリ内に001.png〜009.pngのファイルが作られます。これをアニメーションになるように動画ファイルを作成して仕上げになるわけですが、それも解説していくと長くなってしまうのでそちらはまた別の機会に。
あとsprintf自体はC言語の書式で使えるようです。他にgnuplotで使える文字列関数は公式ドキュメント(version5.2のもの)のp31に書かれています。
gnuplot documentation

gnuplot関連のブログ記事

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

コメント

スポンサーリンク


このブログの人気の投稿

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

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

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

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

Pythonのformat()を使って1桁の16進数でも2桁で出力する方法