gnuplotのrereadとifを使ったループを利用して、アニメーションを作りました。某学会の発表で使用したものです。
gnuplotにはgifアニメーションを作成する機能があるのですが、どうも色数などに制限があるようなので、この例では番号つきのPNGファイルを何枚か作成し、それをgiamというプログラムでgifアニメーションに結合するという方法を採っています。
詳細は省略しますが、2枚のLayerと6つの円柱と6つの円盤(円柱の底面)をそれぞれ擬似ファイル"++"
を用いた媒介変数表示を駆使して描画しています。このように"++"
を用いているためgnuplot4.3以降でないと動作しません。色のつけ方については3次元グラフ表面の色づけを参考にしてください。
#モードの切り替え
MODE = "PNG_ANIMATION" # 番号つきのPNGファイルを生成
#MODE = "ANIMATION" # Windows Terminalでアニメーション
#MODE = "TEST" # 1コマ目のみプロット
#変数の初期化
if (exist("time")==0 || time < 0) time = 0; i=0
set pm3d depthorder
set palette defined ( -2 "green", 0 "blue", 1 "yellow", 2 "red" )
set samples 100
set isosamples 100
set xrange [0:1]
set yrange [0:1]
set zrange [-1.3:1.3]
#アニメ用のパラメータ
dt = 0.5 # 時刻の増分
time_max = 20 # 時刻の最大値; time_max / dt + 1 = PNGファイルの枚数
#円柱の半径
r=0.03
#円柱の傾きを決めるパラメータ
tilt = 0.4 + 0.05 * sin(2.0*time/time_max*pi*4)
#グラデーション用の関数
color(x,y)=(1+sin(7*x*pi))*0.5 # Layerのグラデーション
color_circ(x,y)=-sqrt(x) # 円柱の底面のグラデーション
if (MODE eq "PNG_ANIMATION") set term png
if (MODE eq "PNG_ANIMATION") set out sprintf("./animation/vortex_%03d.png", i)
set border 0
unset xtics
unset ytics
unset ztics
unset key
unset colorbox
splot "++" using 1:2:(1):(color($1,$2)) with pm3d,\
"++" using 1:2:(-1):(color($1,$2)) with pm3d,\
"++" using (11.0/14.0+r*$1*cos($2*2*pi)):(0.1+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (11.0/14.0+r*cos($2*2*pi)):(0.1+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d,\
"++" using (11.0/14.0+r*$1*cos($2*2*pi)):(0.5+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (11.0/14.0+r*cos($2*2*pi)):(0.5+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d,\
"++" using (0.5+r*$1*cos($2*2*pi)):(0.1+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (0.5+r*cos($2*2*pi)):(0.1+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d,\
"++" using (0.5+r*$1*cos($2*2*pi)):(0.5+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (0.5+r*cos($2*2*pi)):(0.5+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d,\
"++" using (3.0/14.0+r*$1*cos($2*2*pi)):(0.1+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (3.0/14.0+r*cos($2*2*pi)):(0.1+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d,\
"++" using (3.0/14.0+r*$1*cos($2*2*pi)):(0.5+r*$1*sin($2*2*pi)+tilt):(1.03):(color_circ($1,$2)) with pm3d,\
"++" using (3.0/14.0+r*cos($2*2*pi)):(0.5+r*sin($2*2*pi)+tilt*$1):(-1.0+$1*2):(-1) with pm3d
if ( (MODE eq "ANIMATION" || MODE eq "PNG_ANIMATION" ) && time < time_max) time=time+dt; i=i+1; reread
if (MODE eq "ANIMATION" || MODE eq "PNG_ANIMATION" ) time = -1;set term win; set out
if (MODE eq "PNG_ANIMATION" ) replot