gnuplotの常用スクリプト解説
概要
, 第一稿.
emacs org-mode
で手持ちの gnuplot
スクリプトを解説する。
主に自分の備忘録のためと、ゼロから始める初心者がある程度綺麗なプロットを描けるようにするテンプレートを公開したいと思った。
グラフの種類
ターミナル
reset set encoding utf8 set terminal svg enhanced size 600,400 font "Arial:Bold,12" # svg # set terminal pdf enhanced size 5in,3in font "Arial:Bold,12" # pdf # set terminal png size 900,600 font "Arial,14" # png
reset
- 前のプロットで用いた設定をリセットする。おまじない。
set encoding utf8
- Unicodeを使えるようにしてギリシャ文字や特殊文字などを直接入力できるようにする。
set terminal
- なるべく高画質にしたいのでベクター形式の
svg
,pdf
などがおすすめである。
だがグラフを用いる環境によってはそれが許されないのでpng
やgif
(アニメーション用)も考慮に入れたい。
また、フォントはここで指定したものが他の全てのフォントに影響する。
ファイル入出力
data1 = "inputfile1.dat" set output "out.svg"
入力ファイルを簡単な名前の変数にすることで、たとえば plot data1 using 1:2
というように扱いやすくなる(と自分は思う)。
出力ファイルもここで設定した。
set terminal
で決めたファイル形式と同じものを指定する。
パラメトリックな関数
# set parametric
2次元プロットの場合は t
が、
3次元プロットの場合は u, v
が、それぞれ媒介変数となる。その場合
xrange, yrange(, zrange)
ではなく trange, urange, vrange
を使うので注意。
plot x(t), y(t)
,
plot x(u,v), y(u,v), z(u,v)
のようにしてプロットする。
極座標形式
# set polar
極座標形式になる。
xrange, yrange(, zrange)
ではなく rrange, trange
を使うので注意。
plot r(t)
,
のようにしてプロットする。
3D描画時の設定
# set xyplane at 0 # <- position of xy-plane in z axis # set hidden3d # 図形の向こうのborderなどを隠す # set contour # 等高線 https://atatat.hatenablog.com/entry/gnuplot19_contour
これはz軸を含めた3次元のプロットをする時に使うので普段はコメントアウトしている。用いるときは plot
ではなく splot
でプロットすることを忘れないようにする。
ヒートマップ描画時の設定
# set pm3d map interpolate 0,0 # set palette rgbformulae 22,13,-31
ヒートマップはどちらかというと3Dの一種であるから、これも splot
を使う。
枠組みの設定
軸/枠
set border unset zeroaxis # xzeroaxis, yzeroaxis
グラフを囲う border
か、数学の教科書で見るようなx軸とy軸にする zeroaxis
かを決める。個人的には border
が好みである。
グラフの縦横比
グラフ端からの余白
set lmargin 3 set rmargin 0 set tmargin 2 set bmargin 2 # unset margin
グラフと描画領域の間の余白を決める。もちろん画像サイズと縦横比の兼ね合いでそれ以上の余白が空くことがある。
グラフを画像サイズとの比で決めた場合は基本 unset margin
で良いと思う。
罫線
# set nogrid # set grid polar pi/6 # polar # set grid x y z vertical # 3D set grid linetype 1 linewidth 0.75 linecolor "gray"
軸の目盛から引かれる薄い線のことである。もちろん濃くしたり太くしたりもできるが、プロットの邪魔になると本末顚倒である。
タイトル・軸ラベル・目盛の文字形式
set title font ",16" offset 0,-1 rotate by 0 center set xlabel font ",14" offset 0,1.0 rotate by 0 center # 3D: parallel set ylabel font ",14" offset 2.0,1.0 rotate by 90 center # 3D: parallel # set x2label font ",14" offset 3,0.5 rotate by 0 center # set y2label font ",14" offset -5,0.5 rotate by 0 center # set zlabel font ",14" offset 3,0 rotate by 0 center # 90 set xtics font ",12" offset -0.0,0.5 rotate by 0 nomirror set ytics font ",12" offset 0.1,0 rotate by 0 mirror # set x2tics font ",12" offset 0,0 rotate by 0 nomirror # set y2tics font ",12" offset 0.1,0 rotate by 0 nomirror # set ztics font ",12" offset 2,0 rotate by 0 nomirror
それぞれの文字のフォントや大きさ、位置などを決めている。
目盛
# set tics scale 1, 0.5 # default: 1, 0.5 # set tics in # or out
目盛の長さと方向を決める。
目盛の表記
# set format x "%h" # default format set format x "%.0Pπ" # 0π 1π 2π 3π ... # set format y "%2.0t x 10^{%T}" # 13 x 10^{5} etc. # set format y2 "%5.2f" # 23.44 etc. # set format z "10^{%L}" # 10^{3}, e^{4} etc.
目盛の数値をどのように表示させるかを決める。デフォルトでも対数軸を上手に表示するらしいので、基本的には使わずに様子を見て、気に入らなければ変えればいい。
対数目盛
# set logscale x 10 # set logscale y 10 # set logscale x2 10 # set logscale y2 10 # set logscale z 10
対数軸にする場合に。軸の後ろの数字は基数で、 10
以外では 2
とか exp(1)
とかがよく使われるだろう。
サンプル数
set samples 200 # default: 100
関数を描画した時に、なめらかなはずの曲線が角ばって見えたり、急峻な関数がありえない所で途切れたり、無限大とマイナス無限大が繋がってしまったりすることがある。その時にこの値を増やすようにする。
ただし値は 1000000 以上にすると計算量が爆発してしまうので、
100000 程度に留めておくのが賢明である。また、ベクター形式の svg
や pdf
出力の場合、サンプル数が増えるとファイルサイズも肥大化するのでそこも注意。
定数・変数・関数
# --- trigonometry --- set angles radians # or angles # linear fitting example # F(x) = A0 * x + B0 # fit F(x) data0 using 1:2 every ::1::86 via A0, B0 # Ftitle = sprintf("F(v) = %2e v + %3f ", A0, B0) # set label 1 sprintf(Ftitle) at -100,6 left f(x) = sin(x)/x g(x) = (x*cos(x)-sin(x))/x**2 # f'(x)
ここで計算に用いる数値などを定義する。ちなみに pi
は元から定義されている。
ここで定義した値は軸の値域や目盛の間隔を設定する時に使えるので、ラベルやタイトルより先に記述しておきたい。
ラベルやタイトル
タイトルと凡例
set title "example" set key left top # at x,y; L/R outside; above/below set key box linestyle -1 linewidth 0.75 linecolor rgb "gray" set key title "凡例" font ",12" # or notitle set key spacing 1.2 width -3 height 0 set key Left reverse # Right/Left jusfitied text # set nokey
まずはタイトルを書く。 {/:Italic text here}
で部分的に斜体にしたりも可能。
またタイトルに限らないが、文字列は全て sprintf()
関数でも表すことができるため、望ましい数値などを結果に応じて挿入することもできる。
set key
で凡例の位置や囲い、要素間の間隔などを設定できる。
軸ラベル
# --- X AXIS --- set xlabel "{/:Italic x}" set xrange [-3*pi:3*pi] noreverse set xtics () set for [i=-3:3] xtics add (i*pi) # set mxtics 5 # unset for logscale # --- Y AXIS --- set ylabel "{/:Italic y}" set yrange [-0.5:1.1] noreverse set ytics -0.4, 0.2, 1.0 # ("face1" pos1, ..., "faceN" posN) set mytics 2 # unset for logscale # --- Y AXIS II --- # set y2label "" # set y2range [-1:1] noreverse # set y2tics -1, 0.1, 1 # ("face1" pos1, ..., "faceN" posN) # set my2tics 5 # unset for logscale # --- Z AXIS (3D) --- # set zlabel "" # set zrange [-1:1] noreverse # set ztics -1, 0.1, 1 # ("face1" pos1, ..., "faceN" posN) # set mztics 5 # unset for logscale
描画
図形とテキスト
# set arrow 1 from -5,0 to 185,0 nohead lt 0 lw 2 # set arrow 2 from f2,0.08 to f2,100 nohead lc rgb "forest-green" lw 2 # set arrow 3 from f3,0.08 to f3,100 nohead lc rgb "forest-green" lw 2 # set label 1 sprintf("2D growth") at 0.1,840,4 left # set label 2 sprintf("810 deg.C") at 0.927,0.17 left # set label 3 sprintf("700 deg.C") at 1.024,0.315 right
プロット
# lines / points / linespoints // impulses / boxes / steps / fsteps / hsteps # linetype: 色 -1:black, 1:purple, 2:green, 3:skyblue, 4:yellow, 5:gold, 6: darkblue # pointtype: 形 1:+, 2:x, 3:star, 4:sq, 5:sq-fill, 6: circle, 7:circle-fill, tri, downtri, diamond, penta # splot \ # for 3D plot \ f(x) with lines linetype 1 linewidth 2 title "sin(x)/x" , \ g(x) with lines linetype 2 linewidth 2 title "d/dx sin(x)/x" # , \
実行結果
これらの要素を全て繋げて実行すると、このような画像ファイルが得られる。ベクター形式なのでいくらズームしてもピクセルが目立つことはない。
また、繋げて得られたスクリプトファイルはここからダウンロードできる。