gnuplotでアニメーショングラフを作成してみよう(Gifアニメ編)

gnuplotでこんな風にアニメーションするグラフを作ってみたいと思いませんか?どうです?


と、問いかけておいてなんですが、実のところgnuplotでアニメーションを作成する方法はいくつかあって、なかなかどれがいいとは言えないです。
(あ、ちなみに紹介したその動画は9年くらい前に私が作ったヤツです)
まぁブログタイトルでネタバレしてますが、今回はGifアニメを作成する方法を紹介していきます。その他の方法についてはまた次の機会にでも。

今回の参考資料

公式ドキュメント gnuplot documentation

なお、このブログ記事を書くに当たって、環境としては
OSはUbuntu 18.04LTS、gnuplotはVersion 5.2 patchlevel 2を使用しています。

アニメーション作成の基本

gnuplotでのアニメーション作成で最も基礎的なのは、出力ターミナルをjpegやpngに設定してグラフプロットをひとコマずつ画像ファイルとして出力、それらをつなげてアニメーション動画にするという方法。はい、ちょっと考えるだけでめんどくさいですね。具体的に言うと、アニメーションとして秒間30コマ、それを10秒つなげるだけでも300コマのグラフが必要になります。パラメーター値を変えながら300回plotする必要があるわけです。1分間ならその6倍の1800回!おまけにパラメーター値だけでなく出力ファイル名もその都度変更が必要になります。これは気が遠くなる…、というわけでこの方法はこれ以上考えないこととします。
(しかしアニメーションを作る基礎としては大切なことなので、考えることについては損ということではないです。作る方法として時間と手間がかかり過ぎるというだけで…)

アニメーション作成方法

さて話をやや差し戻しますが、gnuplotでアニメーションを作るという場合に2つのケースに分かれます。1つはいくつもの画像ファイルを作成してそれらをつなげてアニメーション動画にする場合(a)。もう1つはplotするときのウィンドウ内でアニメーションさせる場合(b)です。
(a)の場合、動画にするには出力した画像ファイルを動画編集ソフトを用いて連結する必要があります。また(b)の場合ですが、ウィンドウをそのまま画面キャプチャーソフトでキャプチャーしてしまえばすぐ動画に出来たりもします。このへんの話はどうやって最終的に動画にしたいのかという手段の話になりますが、まぁ自分がやりやすい方法でやればいいでしょう。なんならスマートフォンのカメラでパソコン画面を動画撮影したってやって出来ないことはないですし👍

前段の話が長くなりましたが、さっそくgnuplotでアニメーションを作る話に入ることにします。なお今回解説するGifアニメを作成する方法では出来上がるのはGifアニメファイル1個のみになります。

Gifアニメ作成

Gifアニメ作成方法は出力ターミナルにGifを指定するもので、そこにanimateオプションを付けることでplotで出力するものが連結されていきます。
雑に作ると以下のような感じで書けます。
set term gif animate
set output "test.gif"
plot x
plot sin(x)
splot x*y
plot 2*x**2
set output

これでカレントディレクトリにtest.gifが出来ています。雑多な数式をプロットしただけなのでアニメーションとして見れたものでは無いですが、形式としてはアニメーションになっているはず。もし上のコードを実行してもうまくGifアニメが動かない場合は一度gnuplotを終了して始めからやり直すとうまくいくと思います、たぶん。
しかしこれでは結局はアニメーションに必要な数だけplotをし続ける必要があります。これもめんどう。

というわけで、その労力を無くすためにプログラミングでよくあるループ処理を組むことにします。昔のgnuplotにはあまりプログラミング機能が付いていなかったようですが、いまでは結構機能が揃っています(ループ処理自体、昔からあったかそれとも無かったかは調べていないです、すみません)。

ループ処理には公式ドキュメント 73ページのDoコマンドを使います。Doコマンドと言っても do for ... のカタチで使います。for文なら他のプログラミング言語でもよく見かけるので馴染み深いです。簡単なコードを書くと以下のようになります。
set term gif animate delay 1
set output "test.gif"
do for [i = 1:360] {
plot sin(x-i*2*pi/360)
}
set output

出来たGifアニメはこんな感じになります。
簡単にコマンドを解説しておくと、set termのdelayというオプションですが、これはGifアニメのコマ送りの間隔になります。値が大きくなるほどコマ送りが遅くなっていきます。ただしこれはGifアニメを見るソフトで扱いが違うらしく、ソフトによっては速く見えたり遅く見えたりするようです。
do for ...の構文の書き方はドキュメントを読んでもらうとして([]内の書き方はいくつかある)、ここは1行だけで
do for [i = 1:360] { plot sin(x-i*2*pi/360) }

と書くこともできます。
始めに解説していませんでしたが、最後の行のset outputはここでGifファイルへの出力を止めるという指示です。
この行があっても無くてもGifファイルは出来ますが、余計な画像が入らないようにするには明示的にこの文を入れておけば安心かなと思います。 
公式ドキュメントを読むと最後のset outputでGifアニメの終端処理を行っているようです。やらなくてもGifファイルは出来ますが、やっておいた方が無難でしょう。

数式のsin(x-i*2*pi/360)はsin(x)の位相を1°ずつ変えていくという指定ですが、まぁ話の本筋ではないので数式については深入りしないでおきましょう。

さて、以上のようにGifアニメ作成までを解説したわけですが、始めにも書いたようにgnuplotには他にもアニメーション作成の方法があるわけです。Gifアニメ作成だけあればいいじゃない、とそういうわけにもいかず、この方法では使える表現がgnuplotのGifフォーマットで出力出来るものに限られてしまうという制限が付きます。そんなわけでその他の方法も使うかどうかによらず、知っておいても損はないでしょう。
ちなみにX11やqtなどウィンドウ出力でも今回紹介した方法は使えます。ただ一瞬で出力されてしまうので、出力毎にいくらか遅延を入れておくと見やすいアニメーションになります。遅延を入れるにはpauseコマンドを用いて以下のようにします。 値は適当にいじって下さい。
do for [i = 1:360] { plot sin(x-i*2*pi/360) ; pause 0.01}


最後に

さて基本的にこのブログ記事の解説としては公式ドキュメントに書いてあることをなぞって書いているので、興味がある方はそちらを読めばより知識が深まるでしょう。このブログでも引き続き解説記事を書いていこうと思うので、興味があればまた読んでもらえると幸いです。
それではまた👋


(※ 始めの動画について記述した9年前のブログ記事はこちら [ソフト] gnuplotでpm3dによる三次元表示について)


gnuplot関連のブログ記事


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

コメント

スポンサーリンク


このブログの人気の投稿

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

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

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

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

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