gnuplot

注意: 使用しているのはgnuplot 4.6.5 (4.6.3,4.6.4)である。それ以前のバージョンで使用できないコマンドもある。 備忘録。基本的なコマンドの説明はしないつもり。(忘れやすいものはところにより書いてある。) last updated on 2017/05/15(月曜日) 11:30:37

色の設定等

variableは,ファイルから読み込む際に使うコマンドである。3次元の図でファイルの4行目をポイントサイズ, 5行目に色の情報を入れておいて次のようにかけばいい。 sp "filename" u 1:2:3:4:5 w p ps variable lc variable 1,2列目に座標の情報, 3列目に物理量があるときに, その物理量を値に応じて色付けする。 p "filename" u 1:2:3 w p palette シンボルの種類や大きさの設定は普通のwith pointsと変わらない。with dotでも同じようにかける。splotでも同様である。 メッシュ状のデータであれば, image plotをするときれいになる。 p "filename" u 1:2:3 w image カラーバーの設定等は, pm3dやpaletteなどと同じ。 カラーバーを非表示にしたいときは次のコマンドを打つ。 unset colorbox 再び表示させたければ, set colorboxとすればよい。 カラーバーを反転させたければ, 以下のようにする。 set palette negative 戻す際には, positive colorboxのticsを1ずつにしたいなら, set cbtics 1 colorboxの位置を自由に調整する。 set colorbox user origin hini,vini size 0.03,vsize 色の変化の方向を上下から左右に変えたい場合, colorboxの後ろにhorizontalをつければよい。 (戻したいときにはvertical) 凡例の色を変更する。 set key tc rgb "color" 使用できる色のリスト (参考URL) お手軽カラーバー。 set palette cubehelix start 0.5 cycles -1.5 saturation 1 (参考URL)

label,凡関係例

各点に情報を書きたいときには, n列目に情報を入れておいて, 次のように書けばいい。 p "filename" u 1:2:n w labels ラベルの位置を左に(1,0)だけ動かしたければ, p "filename" u 1:2:n w labels left offset 1,0 offsetは省略できる。 凡例の場合は, set xlabel "xname" offset 1,0 のように書く。 ラベルの色の設定をしたければ, tc rgb "color"を後ろに指定してあげればよい。 図の凡例にデータファイルから読み込んだデータを入れたいときには, title column (line number)とすればいい。(参考URL) p "filename" u ($0):2:xtic(1) title column(2) w p labelを縦書きにしたい。 set label "label" at a,b rotate set labelを使うときにlabelに色付けをしたい。 set label "labelname" at a,b left tc rgb "color" labelの文字のsizeのみを変更したい。 set label "labelname" at a,b left tc rgb "color" font "Times,20" 凡例の線分の長さを変更する。 set key samplen 2 デフォルトは4となっている。 dashed lineの線分の長さを変更する。 set term postscript eps enhance color dl 2 dlはdashed lengthの略。 文字をイタリックにする方法 "{/Italic *}", "{/Times-Italic *}" という書き方もあるが, これではギリシャ文字等を斜体にしたいときに困る。そういう時には次のように書けばよい。 "{/Symbol-Oblique *}" Symbolを使うときの注意(png出力のときだけの問題かもしれない) {/Symbol *} を使うときには, "でなく'を使わなければならない。 and [&]を表示させる。(以下のPostscript character codesで表示されない場合) \\& かける [\times]を表示させる。 {/Symbol \264} いろいろな文字を使いたい(Postscript character codesを使う)。 (参考URL(PDF)) ギリシャ文字を使いたい。 (参考URL) 使用できる凡例のリスト (参考URL)

tics,key関連

tics等で, 10のベキ乗で書きたいとき, 次のように書けばよい。 set format y "10^{%L}" べき部分だけでなく仮数部分も書きたい場合は, 次のようにする。 set format y "3.0lx10^{%L}" 桁数を指定して表記したければ, C言語のprintfと同様に%5.2fとすればいい。 対数軸でプロットする際, formatで%T とすれば, 指数部のみを書ける。 (%t では仮数部) 小さい数字を使うとき, 0の値を小さくしておかなければ描写してくれないので設定を変更する。 set zero 1e-15 デフォルトでは1e-8が入っている。 key boxの外側に数字が出てしまうことがある。解消法としては, 書き出しの方法をti " degree"とかにすれば解消できる。 keyの長さがおかしい時には次のようにする。 set key width -10 図のticsの位置にある棒を前面に出したいときの対処法。(image plotを使うときに特に有効) set tics front imageプロットなどをするときには, arrowやlabelなどの情報を明示的に前面に出さないと見えなくなる。 set arrow from a,b to c,d front imageプロットで, 黒系色で塗りつぶす場合に, ticsが見えなくなってしまうので, ticsに色をつけたい場合(あまり賢い方法が思いつきません...)。 (例) x2ticsもアリバージョン set multiplot set cbr [1:5] set cbtics 1 set palette define (0 "black",1 "dark-blue",2 "blue",3 "red",4 "magenta",5 "pink") set xrange [0.5:1.5] factor=13.6 set x2range [factor*0.5:factor*1.5] set xtics nomirror set xtics 0.2 tc rgb "black" set ytics tc rgb "black" set x2tics 5 tc rgb "black" set xlabel "R [degrees]" set x2label "R [kpc]" set border lc rgb "white" set tics front set bmargin 0 set rmargin 0 set tmargin 0 set lmargin 0 set origin hini,vini set si hsize,vsize unset colorbox p "data.txt" axes x1y1 w lp ps 0.01 lc 1 notitle,"data.txt" u (factor*$1):2:3 axes x2y1 w image notitle set border lc rgb "black" unset xtics unset ytics unset x2tics set format x "" set format y "" unset xlabel unset ylabel unset x2label set colorbox user origin hini+hsize+0.02,vini size 0.03,vsize p x w image notitle unset multiplot

set size square関連

pm3dなどで, z=f(x,y)の関数を真上から見たときの床面のxy平面は, set si sqをしても長方形になってしまう。そのような時には, 次のようにする。 set view equal {xy|xz} 補足すると, 初めのset view equal xy は, 底面を正方形にするためのものではなく, xy軸の単位長を同じ長さにするためのものであるので, set size squareの3次元版ではない。元の関数の範囲を同じ幅にするようにスケールを変換しておいて, それぞれのticsを自分でつける必要がある。 真上からの等高線を正方形にするなら, 次のようにしてもいい。 set view map; set size square こちらは, set view 0,0; set size squareでも問題なさそうに見えるが, これではうまくいかない。set sizeの設定が, set view mapにしか効かないからである。 eps出力で, set size squareをしたときに, 出力されるepsファイルの右に余白ができてしまう。これは, epsの場合のデフォルトの出力が5x3インチであることが原因である。 set term postscript eps size 3.5,3.5 set size square とすれば余白のない正方形のeps画像が作れる。 作ってしまったものに関しては, 小手先のテクニックで処理してもいい。

multiplot関連

set size squareを使うと, multiplotでの図のサイズの挙動がおかしくなる。その際は, set sizeで正方形に設定すればいい。 set si 0.741,1 よく使うmultiplot用初期設定フォーマットを下に示す。 set origin hini,vini set size hsize,vsize のようにして使う。 <3x4の場合> hini=0.07 vini=0.09 hsize=0.21 vsize=0.22*(1./0.741) brank=0.004 h2ini=hini+hsize+brank h3ini=hini+2*hsize+brank*2 h4ini=hini+3*hsize+brank*3 v2ini=vini+vsize+brank v3ini=vini+2*vsize+brank*2 multiplotをする際に軸の数字を大->小, 小->大に反転したい時がある。その時には, set xrange [min:max] reverse と設定すればいい。(デフォルトでnoreverseが入っている) これは, 一度明示的に[max:min]としたときに, このreverse設定が保存されてしまうのが原因であると考えられる。 range系列(x,y,z,x2,y2,cb)は全てこの設定がかかっている。 はずだが, cbrangeについては作動しない。

print文関連

printは標準エラー出力がデフォルトである。printの出力先を標準出力に変更するには, 先に次のコマンドを入力しておけばいい。 set print "-" 使い勝手以がいい状況としては, gnuplotでfittingをした際には, その結果が標準エラー出力にだされる。print文で出力してファイルなどに保存したい情報があるときに, 情報を標準出力でだしてあげれば, データをterminalから吸い取りやすい。 do forループ内でset labelをつかって連番情報等をのせたいときは, ループの中でsprintf( )でかけばよい。

set terminal関連

eps出力と, png出力で書式が異なる。 set term postscript eps enhanced color "Times" 18 fontfile 'cmsy10.pfb' set term png enhanced font 'Times,18,fontfile cmsy10.pfb'

その他

binに切るプロットをする際には次のようにすればよい。 p "filename" w histeps ,区切りのデータの読み込みは, 次のようにすればよい。 set datafile separator "," 条件付きプロット(条件は何重にもかけられる) p "filename" u 1:2:($3==1 ? $3:1/0) w d 条件が満たされたときは3列目の情報を描き, それ以外は何も描かない(1/0)。 任意の位置, 任意のサイズの四角形を描写したい時には, 次のようにすればよい。 set object 1 rect from a,b to c,d fc rgb "color" fs silid 背景に置きたければ, fcの後ろにbackと書く。前面に置きたければ, frontと書く。 gnuplotで日本語を使いたいときは, 次のようにする。 set term postscript eps enhanced font "Ryumin-Light-EUC-H" 16 gnuplotを一時的に抜けてターミナルで作業したいときは, shellというコマンドを打つ。ターミナルからgnuplotに戻ってくるときはexitで戻ってこられる。

for文

連番ファイルの図示に次のような表記が便利である。 tnum(n)=sprintf("t=%5.3f",n*0.125) filename(n)=sprintf("file%03d.txt",n) filename2(n)=sprintf("file_%03d.eps",n) do for [i=0:100]{ set output filename2(i) p filename(i) u 1:2 w l ls 1 ti tnum(i) set output } データセットが以下のように横並びな場合のプロット。 data.dat: x1(t=0) y1(t=0) x2(t=0) y2(t=0) x3(t=0) y3(t=0) x4(t=0) y4(t=0) ... xn(t=0) yn(t=0) x1(t=1) y1(t=1) x2(t=1) y2(t=1) x3(t=1) y3(t=1) x4(t=1) y4(t=1) ... xn(t=1) yn(t=1) x1(t=2) y1(t=2) x2(t=2) y2(t=2) x3(t=2) y3(t=2) x4(t=2) y4(t=2) ... xn(t=2) yn(t=2) ... p for[i=0:n] "data.dat" u i*2+1:i*2+2 w l not のように書けばよい。 x1 y1 z1 x2 y2 z2 ...の場合にx, yのみ書きたい場合は, p for[i=0:n] "data.dat" u i*3+1:i*3+2 w l not (ただし, eps出力時はn=100くらいまでしか書いてくれない.. 原因究明中)

if文

if文に対するサポートは, 徐々に改善してきているが, else ifが使えず以下のような使い方にとどめている。 COLOR=2 if (COLOR==1){ set palette define (0 "dark-blue",0.3 "blue",1.5 "cyan",4.0 "orange",5 "red") } if (COLOR==2){ set palette define (0 "dark-blue",0.3 "blue",1.5 "cyan",4.0 "orange",5 "yellow") }

表示位置設定

label,arrow,object等の位置を指定するときに, from a,b to c,d のように書くが, この書き方は軸の座標系を基準にした指定法となっている。 グラフ内の相対的な座標系で指定したければ, from graph a,b to graph c,d とすればよい。四角形を描きたい, multiplotで図の中に図を描きたいといった場合は便利。 スクリーンの座標系で指定したければ, from screen a,b to screen c,d とすればよい。この方法は大量に図を作るときには制御しやすい。

太陽質量

texで用意されているフォントファイルを呼ぶ, もしくは手元のディレクトリに持ってくる。(参考URL) /usr/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmsy10.pfb そして, 次のようにフォントファイルを呼ぶ。 set term postscript eps enhanced "Times" 18 fontfile "cmsy10.pfb" set label "2x10^9[M_{/CMSY10 \014}" at a,b 失敗するなら, cmsy10.pfaに変換して呼ぶ。

等高線

等高線を書くときにに役立つサイト。 一度, テーブルデータにはき出して, それを読み込むといい。 p "tablefile" i 0:0 w l,"tablefile" i 1:1 w l 等で描くことができる。 テーブルデータはブロック分けされていても問題はないが, 等高線が滑らかにつながるようにデータブロックの順番は調整する必要がある場合がある。 等高線の中を塗りつぶしたいときは, filledcurveを使うが, その際にはデータ上でつながっているはずの点と点はデータテーブル内でもくっつけてあげないとうまく描いてくれない。

極座標系

極座標系でプロットしたい時には, set polar と打てばよい。(x,y)=(角度,動径距離)となる。 度表示かラジアン表示かを選ぶことができる。 set angles degrees set angles radians

everyの使い方

p "filename" ev 飛ばす行数:飛ばすブロック数:開始行:開始ブロック:終了行:終了ブロック 順番を守れば, それ以降の指定を省くことができる。 例えば, 5行目から50行目までの情報をプロットしたければ, (なお, これはすべてのブロックに適用される) p "filename" ev ::5::50 1つおきのブロックで1行ずつ飛ばしたければ, p "filename" ev 2:2 初めの10ブロックだけ使いたければ, p "filename" ev :::::9

初期設定

初期設定情報を確認する。gnuplotを開いた段階で, いろいろな設定がかけられている。思ったとおりに動かないなど困ったとき, まれに参考になる。 save "outputfile" gnuplot 4.6.4のデフォルト設定はこうなっている。(default)

外部から引数を渡す

gnuplotのスクリプトに引数を渡したい場合がある。その際にはloadではなくcallを用いる。 ターミナルからの実行ファイルは、exe.pltを用いる。 引数はファイル名の後ろに並べる。引数には""をつけることが推奨されている。 引数の受け方は$0,$1,$2のように受ける。 弊害として、 p "data.txt" u ($$1):($$3) w p のように記述を変更する必要がある。 /*exe.plt*/ call "test.plt" "figdir" 1 3 /*test.plt*/ set term postscript eps enhanced color "Times" 16 set output "$0/test.eps" set multiplot layout 1,3 set rmargin 2 set lmargin 5 print "input=$1,$2" set xr [0:10] do for[i=$1:$2]{ p sin(i*x) w lp lc i lt i*2 } unset multiplot set output

小手先サイズ変更

gnuplotではないが, 作成したepsファイルの容量を劇的に小さくする方法(失敗あり)。 Gs -q -sDEVICE=epswrite –sOutputFile=out_figure.eps –r600 –dAUSE –dBATCH –dEPSCrop in_figure.eps for i in *eps; do ps2pdf -DEPSCrop $i; done 成功しやすい方法(Windows) epsファイルをIllustratorで開き, ファイル書き出し->BMPで保存を選択する。 この際, bpiを選択するところがあるのだが, 300bpi or 150bpiを選択する。 そうして出来たbmpファイルをEPS-convにかませる。 FLATEファイル形式にするとものすごく圧縮されるのだが, epsファイルとして保存されているので, texのコンパイルは通る状態である。 16色にしてもそんなに質は落ちない。 経験上, 256色->16色にする方が, 300bpi->150bpiにするよりも綺麗な図ができることがわかった。 pngファイルを小さくしたいときは次のようにする。 pngファイルを小さくする convert –geometry 40%

ファイル変換

Imagemagicを使ってファイル形式を変更する。 複数のepsファイルを一気にpngファイルに変換する。 for f in *.eps; do convert $f ${f%.eps}.png; done set si sqで表示して左右に大きな空白ができてしまった, 複数のepsファイルの空白を切り取る。 for f in *.eps;do sed -e "s/50 50 410 302/100 50 350 302/" $f > n${f%.eps}.eps;done Windowsで行う場合 Photoshifterを使って, png,gif画像のトリミングを一括でできる。 たとえば, set si sqで左右に空白ができてしまったものについては, 変換設定->トリミングを有効にする->幅設定(左35 右40) リサイズ->リサイズを有効にする->幅75% ,縦横比維持を外す。 変更を保存 出力ファイル形式も変更可能。

関連情報

-バージョン変更による更新情報, 少しマニアックな方法等で参考になるページ。 (参考URL) -gnuplotをソースからインストールする際に参考になるページ。 (参考URL) -root以外の人が何かをインストールする際に参考になるページ。 (参考URL) インストール先を, /home/mydir/local/gnuplot4.6.5に指定したいとき, ./configure -with-png -prefix=/home/mydir/local/gnuplot4.6.5 make make install ~/.bashrcにて, パスを通すのを忘れずに。