LoginSignup
13
9

More than 5 years have passed since last update.

gnuplotで連番ファイルをプロットする

Posted at

数値計算とかやってると、
result0.dat
result1.dat
result2.dat
result3.dat
・・・
という連番ファイルを作りたくなる事がよくある。
当然できたファイルは結合してアニメーションにして研究室セミナーで発表するとか学会で使うとかしてドヤフェイスをかますのである。
((まぁ実は最近のgnuplotなら、連番ファイルを経ずにアニメーションを作れたりもしますが…。))
で、アニメーションにする方法はさておき、こういう時どうすればいいかを備忘録代わりに。

shell script + バッチファイル

まずバッチファイルを作っておく。

reset
input = sprintf("resuld%d.dat", i)
set term postscript enhanced eps color
set output sprintf("result%03d.eps", i)
plot input なんちゃらかんちゃら
set output
reset

どうせバッチファイルなのでset termは戻さなくていいやと開き直る。
これを適当にloop.pltとでも名づけて保存しておく。
で、次にshell scriptを組む。
gnuplotはバッチファイル食べさせる前に-e "云々"と入れとくと、
前処理として云々をしといてくれるので、ここでファイル番号を変数に突っ込みながら、
処理部分のバッチファイルを食わせてループを回す。
あと、時間削減のためすでに画像ファイルが出来ている場合はスキップさせる。

#!/bin/sh
st=$1
while [ $st -le $2 ]; do
  if [ ! -e $(printf "result%03d.eps" $st) ]; then
    gnuplot -e "i=${st}" loop.plt
  fi
  st=`expr $st + 1`
done

ここまで書いてloop.shみたいな名前で保存したら、実行権限を与える。

chmod u+x loop.sh

んで、実行の仕方はこう。

./loop.sh 0 10

もちろん、環境変数PATHに./が入っていれば頭の./は要らない。
これで0から10番までのファイルが順番に作られる。
あとはimage magickでも使ってアニメイションにしてくだしあ。

gnuplotでforする

割合最近の(いつだ?)gnuplotは、for loopに対応していたりするので、それを使ってしまう。
もうあるファイルはスキップするみたいな小回りは効かないけど。

reset
st = 0
to = 10
offset = 2
do for[i = st : to : offset]{
    input = sprintf("resuld%d.dat", i)
    set term postscript enhanced eps color
    set output sprintf("result%03d.eps", i)
    plot input なんちゃらかんちゃら
    set output
}
reset

残念ながら割と新し目(2014/05/31現在)の機能なので、ちょっと古いgnuplotしか使えなかったりすると駄目だったりする悲しさが有る。

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9