雑記 - gnuplot Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!invalid colorbox option ??
gnuplot 4.2 patch level 3 で保存したファイルを patch level 2 の gnuplot で load すると
gnuplot> load "FL.gnu4

gnuplot> set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.1, 0.63, 0 front bdefault
                                                                                   ^
          "FL.gnu4", line 141: invalid colorbox option
てな error が。4.2.3 に上げて解決。
patch level 3 で colorbox に front option というのが加わったということかな。

!pause
gnuplot の設定ファイルを引数で渡して図を描画させると、一瞬表示した後に消えてしまう。これを防ぐには設定ファイルの末尾に pause -1 を加えておけばよい。こんなかんじ↓
#!/usr/bin/gnuplot
set term x11
plot sin(x)
pause -1
こうすると terminal で改行を入力するまで表示される。

また -persist オプション付きで起動すると改行を入力した後も図は表示され続ける。

!ギリシャ文字と斜体
set ylabel "{/Symbol-Oblique D}({/Italic z}) / {/Symbol-Oblique p} {/Italic T_c}"
のようにして、
set term post eps enhanced "Arial" 24 lw 3 dl 3
みたいにする

!初期設定
~/.gnuplot というテキストファイルの中に設定を書くことで、初期設定可能

!splot
こんな絵が描きたいとき。{{attach_view('hoge.png')}}

次のようなデータを作る。
#  omega,  theta,  n
4.970000e-01 5.050000e+01 1.809472e-02
4.970000e-01 6.917188e+01 2.280921e-02
4.970000e-01 8.387644e+01 2.176572e-02
4.970000e-01 9.304867e+01 1.962956e-02
4.970000e-01 9.759271e+01 3.569119e-02

4.960000e-01 5.050000e+01 1.641266e-02
4.960000e-01 6.917188e+01 2.930498e-02
4.960000e-01 8.387644e+01 2.568140e-02
4.960000e-01 9.304867e+01 1.705182e-02
4.960000e-01 9.759271e+01 2.670954e-02

4.950000e-01 5.050000e+01 1.508653e-02
4.950000e-01 6.917188e+01 4.174454e-02
4.950000e-01 8.387644e+01 3.351103e-02
4.950000e-01 9.304867e+01 1.529229e-02
4.950000e-01 9.759271e+01 2.122146e-02
のような空行で区切ったデータを用意して
set hidden3d
splot "hoge.d" with lines
とすればよい。

!目盛
手動で目盛を付けたい時
set xtics   ("0" 0.00000, "0.3" 0.300000, "a" 0.650000, "1.0" 1.00000)
のようにすると、x軸の 0.0, 0.3, 0.65 1.0 の位置に目盛を刻んでくれる。また 0.65 の位置には a と表示される。またグリッドを表示するには以下のように
set grid

!目盛の文字
上記の方法により手動で目盛を付けた際、記述する文字の向きを変えたりや位置をずらすには、 rotate by や offset を用いればよい
set xtics ("0" 0.0, "hogehogehoge" 0.1, .....)
set xtics rotate by 45 offset 0.0,-0.1
のようにすれば、目盛に付けられる 0 や hogehogehoge という文字を 45 度回転し、(0.0,-0.1) ほどずらした位置に配置できる

!点を打つ
任意の場所に点を打つには label を使う
set label 1 "" point pt 7 ps 2 lc rgb 'red' at 0.2, 0.3
pt 7 は丸い点、ps 2 はサイズ、lc rgb 'red' は色指定

!y2軸を使う
y軸だけでなく、y2軸も使うときは次のように axes を指定
set y2tics
plot "hoge.d" using 1:2 axes x1y1, "hoge.d" using 1:3 axes x1y2
set y2tics が無いと、y2軸の目盛(数値)を書いてくれない

!grid
グリッド線を引くには
set grid
これで x軸と y 軸に関して目盛に合わせた grid 線が引かれる

もし、x軸に関して grid 線を引きたくない場合には次のように
set grid noxtics

y2 軸に対して grid を引くには
set grid y2tics

!複数の 2D plot をまとめて 3D plot  (たぶん普通じゃない使い方)
データ形式が  x, y1, y2, y3, y4, y5, ... のようなデータファイル hoge.d があったとき、通常なら
plot "hoge.d" u 1:2, "hoge.d" u 1:3, "hoge.d" u 1:4, "hoge.d" u 1:5, ...
のようにして 2D プロットするが、描かせる線が多い場合、線が重なってしまってよく分からなくなることがある。このような時、各線を一平面上に重ねた 2D プロットするのではなく、各線の様子をみるために別々の平面上にプロットして 3D 的にぐりぐり回して俯瞰できたらいいな、ということがある。
それを splot で実現するための方法について頭を悩ませていたのだけど、簡単な方法をひらめいたのでメモしておく。(見つけてないけど何処かに書いてあるかもしれない。いろいろ調べてみたのだけど、splot についてあれこれ書いている人は少ないみたい。)

結論だけ書くと実はかなり簡単。
  splot "hoge.d" u (1):1:2, "hoge.d" u (2):1:3, "hoge.d" u (3):1:4, "hoge.d" u (4):1:5, ...
splot の場合、(x,y,z) のセットでデータを与えないといけない。using option で : (コロン)で区切った各データ列を与える必要があるわけだ。ここでは、 x 列を線の番号とし、y 列を data x 、z 列を data y1 or y2 or... としたという話。(なんで x 列の数字をカッコで囲んでいるかの説明は書かないよ。分からない人は調べてね。)

あと、 x 列の目盛りに意味がないので、たとえば次のようにして変えておくといいかも。x 列の目盛り自体を書かないというのもありですね。
set xtics ("A" 1.0, "B" 2.0, "C" 3.0, "D" 4.0, ... )

!line type
version 4.6 と 5.x 以降では、線の style の扱いが若干違うらしい。(linetype じゃなくて dashtype で制御するとか terminal option の solid/dashed が無くなったとか。)
ここでは version 4.6 での話。default の線種がどうも気に入らないということで、どの line type を使うか判断するため default 値のメモ
||linetype||線種||色
||1||実線||赤
||2||破線||緑
||3||破線(短)||青
||4||点線||マゼンタ
||5||一点鎖線||シアン
||6||実線||赤
||7||4点||グレー
||8||二点鎖線||橙
||9||2点||黒
||10||一点鎖線(短)||黄
例えば 4 番の色を青色に変更するには
set linetype 4 lc "blue"
の様にする。

なお、モノクロのグラフにする際には、上記のような line color の変更をしない方が良い。line color を変更したら、線種がずれてしまう。(バグっぽいような…)

!line type (補足)
4.6 と 5.x の違いについて、stackoverflow の[[ここ|https://stackoverflow.com/questions/19412382/gnuplot-line-types]] に書かれた内容が分かりやすい。あと日本語であれば [[こちら|http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/version5.html#color]]とか。

例えば、線の配色については 3つのセットがあるらしい。set colorsequence (set colors) で変えられる。
set colors default              # 5.x 系の配色(color universal design を考慮)
set colors podo                 # color universal design の別配色(Wong (2011) [Nature Methods 8:441])
set colors classic               # 4.6 系の配色

5.x 系になって、配色が universal design を考慮したものになったうえ、 terminal によって色が変わらないようにもなったらしいので、5.x 系に移るべきかな。

!文字変数
例えば、hogehogeahoaho1.d みたいな長ったらしい名前のデータファイルを plot するときに
plot "hogehogeahoaho1.d" u 1:2, "hogehogeahoaho1.d" u 1:3, "hogehogeahoaho1.d" u 1:4, ...
のように書くと見にくいし、ファイル名を変えるのも面倒。こんな時は
n="hogehogeahoaho1.d"
と n に代入したのちに、
plot n u 1:2, n u 1:3, n u 1:4, ...
とした方がすっきり。もちろん次のように一行にまとめても良し。
n="hogehogeahoaho.d"; plot n u 1:2, n u 1:3, n u 1:4, ...
これなら、ファイル名変更も一か所だけでラクチン。

!for と sprintf
たくさんのデータファイルを順次表示するとか、繰り返し操作が必要なときの話。繰り返しは for loop を使い、変化する文字列は sprintf を使う。

例えば、 hoge01.d, hoge02.d, hoge03.d,... といったデータファイルがあったとき、それを順次グラフ化するには
do for [i=0:15] {  n=sprintf("hoge%02d.d", i); plot n u 1:2, n u 1:3; pause 3; }
みたいにすればよい。

!plot ""
ちなみに、同じファイルの異なる列を plot するとき
plot "hoge.d" u 1:2, "hoge.d" u 1:3
と書くかわりに
plot "hoge.d" u 1:2, "" u 1:3
のように略して書くこともできる。

!サンプル数
組み込み関数でグラフを描く時、default のサンプル点が足りなくて正しく表示されないになる(ガタガタになる)ことがある。そんなときは
set sample 10000
みたいにすれば、10000 点のデータで描いてくれる

!式(関数)の定義
ずっと知らずにいたのだけど、式を定義することができる。(今まで変数定義しか知らなかった。)なので、
> a(x)=sin(x)
> b(x)=cos(x)
> plot a(x)*b(x)
とやれば sin(x)*cos(x) を描いてくれる。今更ではあるが、、、