シェルスクリプトの for ループと同様の機能をgnuplotでも使うことができる.
gnuplot> set datafile separator ',' gnuplot> plot for [i=2014:2018] '/home/atmos/ipesc/sample/amedas/Okayama_Okayama_'.i.'.csv' using 0:2
変数 i に 2014 から 2018 までの数字を順番に入れて,どんどん重ね描きする.
変数をファイル名に埋め込むところでは,変数を「.」で囲んでいる(gnuplotではこうすることになっている).
ループで複数の行をまわすこともできる. for の前に do をつけて,繰り返し部分を { と } で囲む.
gnuplot> do for [i=2014:2018] { more> set term pngcairo more> set output sprintf("dailymean%d.png",i) more> set datafile separator ',' more> set xdata time more> set timefmt "%m/%d" more> plot '/home/atmos/ipesc/sample/amedas/Okayama_Okayama_'.i.'.csv' using 1:2 more> } gnuplot>
ちゃんと動作したら,dailymean2014.png から dailymean2018.png の5つのファイルが生成したはず.
ここでは5年分をまとめて図にしたが,もっと長い期間をまとめて図にすることも(簡単に)できる.
例えば,1991年から2020年までをまとめて図にすると
気象庁では,気象を評価する基準として平年値というのを定義していて,平年値は30年間の平均値,ということになっている(平年値).
30年分を図にすることができたなら,平年値も図にしてみたいと思うわけですが,それぞれの日について平均を計算するのは面倒と思う.
でも,gnuplotで「smooth unique」を使うと簡単に平年値を計算することができる.
smooth unique は,同じ x の値をもつデータを平均化する. 例えば
0 1 0 3 0 5 1 2 1 3 1 7 1 4 2 2 4 5
というデータは,smooth unique を追加して plot すると
0 3 1 4 2 2 4 5
の4つの点がプロットされる.
ということで,平年値を重ねてプロットするなら,30年分のデータをまとめたファイル okayama.csv とかを作って
plot 'okayama.csv' u 1:2 with lines smooth unique
としたらよい.
x の値を丸める関数を使ってから smooth unique する.
gnuplot> nearint(x)=( x-floor(x) <= 0.5 ? floor(x) : floor(x)+1 ) gnuplot> filter(x,y)=nearint(x/y)*y
この filter(x,y) を使うと,[(n-0.5)y, (n+0.5)y] の範囲にある x が丸められて ny になる.
gnuplot> plot 'data.dat' using (filter($1,10)):2 smooth unique with lines