UP | HOME

gnuplotの常用スクリプト解説

概要

[2021-03-12 Fri] 作成.
[2021-03-12 Fri], [2021-03-13 Sat] 第一稿.

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 などがおすすめである。
だがグラフを用いる環境によってはそれが許されないので pnggif (アニメーション用)も考慮に入れたい。
また、フォントはここで指定したものが他の全てのフォントに影響する。

ファイル入出力

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 size ratio 2/(sqrt(5)+1) # 1:(y/x), -1 for 1:1 axes

これは画像ではなくグラフの縦横比を決める。

  • set size ratio k で x:y = 1:k になる。
    横を長くするには k が1以下であればいい。
  • set size ratio -k で x と y の単位長が 1:k になる。
    たとえば k=-2 にすると、グラフ中でx軸の値が1増えるとき、y の値は同じ長さで2増える。
  • set size rx, ry でx, y それぞれの画像サイズとの比になる。
    なので 0< rx ≤ 1, 0< ry≤ 1 でなければならない。

グラフ端からの余白

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 程度に留めておくのが賢明である。また、ベクター形式の svgpdf 出力の場合、サンプル数が増えるとファイルサイズも肥大化するのでそこも注意。

定数・変数・関数

# --- 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" # , \

実行結果

これらの要素を全て繋げて実行すると、このような画像ファイルが得られる。ベクター形式なのでいくらズームしてもピクセルが目立つことはない。

また、繋げて得られたスクリプトファイルはここからダウンロードできる。

Sorry, your browser does not support SVG.
図1: 上記のスクリプトを実行して得られる画像

Created: 2021-03-17 Wed 17:06

Validate