Gnuplotの出力をFlashムービー化する方法

動機

Gnuplotの出力したグラフでアニメーションを作成するためには,いくつか方法がある. 例えば,出力形式をGIFに設定し,GIFアニメとして作成する方法. ただ,この方法では,画像がラスター化されるので, 表示の拡大に弱く,またファイルサイズが大きくなりがちである. 別の方法として,Flashアプリケーションを開発するというのも考えられる. Adobeが無償公開しているFlashアプリケーション開発環境Flexは SVG画像の埋め込みに対応していて,かつGnuplotはSVG形式での出力ができる. そこで,埋め込まれたSVG画像を高速切替表示するようなアプリケーションをつくろう, という方法である. この方法の場合,ベクター画像を用いるので,表示の拡大には強い. しかし,ファイルサイズが大きくなる, 動画プレーヤの一時停止コントロールが機能しない,といった問題が起こる.

これらの問題を解決するためには,Flashムービーとして作成すればよい. ところが,Flashムービー作成ツールのうち, Gnuplotの出力を正確に読み込めるようなものは, 今のところ,有償のものしかないようである. それらの有償ソフトウェアにはさまざまな機能が付加されていて, その機能を用いる人にとっては料金分の価値が確かにあるのかもしれない. しかし,今回の目的に限ればそのような機能は必要なく, 料金分の価値は認められない.

そこで,Gnuplotの出力を中間処理し, Flashムービー作成ツールが読み込みやすい形式に変換することを考えた. 考案した方法により,Flashムービーを生成することに成功した.

用意するもの

以下で紹介する方法を実行するためには,GnuplotからPDFで出力を得る必要がある. Gnuplotはバージョン4.0からPDFでの出力に対応しているが, その機能を利用するためには, libpdfを取り込んでGnuplotをコンパイルしなければならない. Windows環境なら,角藤氏のバイナリを使うのが容易だろう.

PDF出力に対応していないGnuplotでもできる方法については, 最終節「そのほかの方法」を参照せよ.

手順

  1. GnuplotからグラフをPDF形式で出力する;
  2. PDF2SWFを用いて,個々のPDF画像から,単一フレームのFlashムービーを作成する;
  3. SWFCombineを用いて,単一フレームのFlashムービーを連結, フレームレートを設定し,多フレームのFlashムービーを生成する.

データセットとして


./dat/sierpinski_0.dat
./dat/sierpinski_1.dat
./dat/sierpinski_2.dat
./dat/sierpinski_3.dat
./dat/sierpinski_4.dat
./dat/sierpinski_5.dat
./dat/sierpinski_6.dat
./dat/sierpinski_7.dat

sierpinski.zip)が得られているとしよう. まずは,これらをGnuplotに入力し,PDF形式でプロットする. 次のスクリプトをGnuplotに渡せばよい:

#!/gnuplot
set terminal pdf enhanced size 6cm,5cm
set output "./pdf/sierpinski_???.pdf"
set lmargin 0.6
set bmargin 0.5
set rmargin 0.6
set tmargin 0.5
unset border
unset tics
set xrange [-0.9:0.9]
set yrange [-0.5:1.0]
plot "./dat/sierpinski_???.dat" notitle with lines

ただし,???0から7までの数字.

そうすると, PDF形式の画像


./pdf/sierpinski_0.pdf
./pdf/sierpinski_1.pdf
./pdf/sierpinski_2.pdf
./pdf/sierpinski_3.pdf
./pdf/sierpinski_4.pdf
./pdf/sierpinski_5.pdf
./pdf/sierpinski_6.pdf
./pdf/sierpinski_7.pdf

が得られる. 次の目標は,これらの画像をSWF形式に変換すること. そのために,次のコマンドを実行する:

pdf2swf ./pdf/sierpinski_???.pdf -o ./swf/sierpinski_???.swf

再び,???0から7までの数字.

あとは,いま得られたSWFファイル


./swf/sierpinski_0.swf
./swf/sierpinski_1.swf
./swf/sierpinski_2.swf
./swf/sierpinski_3.swf
./swf/sierpinski_4.swf
./swf/sierpinski_5.swf
./swf/sierpinski_6.swf
./swf/sierpinski_7.swf

を,SWFCombineで一つにまとめればよい. 次のコマンドを実行する:

swfcombine -z -r 2 -o sierpinski.swf --stack^
    ./swf/sierpinski_0.swf ./swf/sierpinski_1.swf ./swf/sierpinski_2.swf^
    ./swf/sierpinski_3.swf ./swf/sierpinski_4.swf ./swf/sierpinski_5.swf^
    ./swf/sierpinski_6.swf ./swf/sierpinski_7.swf

ここでの出力sierpinski.swfが求めるものである.

そのほかの方法

SWF形式への変換には,OpenOffice.org Drawを用いることもできる. すなわち,GnuplotからEMF形式などで出力を得て, それをOpenOffice.org DrawでSWF形式に変換,さらにSWFCombineで連結すれば, Flashムービーが生成できる.

ただ,上記の方法と異なり,この方法は自動化が難しいようである.