この文書の URL は http://www.cc.kyoto-su.ac.jp/~mtkg/lecture/comp_A/2012/09.html です。

Gnuplot とは

Gnuplot (ぐにゅーぷろっと)は非常に多機能なグラフ作成ツールです。 レポート作成や実験データのプロットに威力を発揮するでしょう。 (エクセルで作ってもよいが。)

起動と終了

ターミナルから gnuplot と入力すると gnuplot が起動して、コマンドを受け付ける状態になります。 (下の「$」はシェルのプロンプトなので入力する必要はありません。 「gnuplot」だけをキーボードから入力し、リターンキーまたはエンターキーを押します。)

$ gnuplot [RET]
…
Terminal type set to 'wxt'
gnuplot>

gnuplot> は Gnuplot のプロンプトです。 このプロンプトに対してコマンドを入力します。

Gnuplot のプロンプトに対して quit または単に q と入力し、リターンキーまたはエンターキーを押すと終了します。 注意:gnuplot> はシェルのプロンプトなので入力する必要はありません。

gnuplot> quit [RET]
$

ヘルプ

help コマンドでオンラインヘルプをみることができます。

gnuplot> help plot
または
gnuplot> ? plot

とすると plot コマンドについての説明をみることができます。

リセット

reset コマンドでいろいろな設定(描画範囲など)を初期状態に戻すことができます。

gnuplot> reset

グラフを描いてみる

グラフをプロットするには plot コマンドを使います。 まずは sin(x) のグラフをプロットしてみましょう。

gnuplot> plot sin(x)

複数のグラフを重ねて表示したい場合はカンマで区切って指定します。

gnuplot> plot sin(x), cos(x)

すでに作図したグラフに別のグラフを重ねるには replot コマンドを使います。

gnuplot> replot sin(2*x)

数学関数

sin だけでなくいろいろな関数があらかじめ用意されています。 自分で新しい関数を定義することもできます。(後述)

sin, cos, tan               三角関数
asin, acos, atan, atan2     三角関数の逆関数
sinh, cosh, tanh            双曲線関数
asinh, acosh, atanh         双曲線関数の逆関数
exp, log, log10             指数関数、自然対数、10を底とする対数関数
sqrt, abs                   平方根、絶対値
他にも多数

演算記号

四則演算などの演算記号は次のようになります。

+   足し算
-   引き算
*   かけ算
/   割り算
%   剰余
**  累乗(x**2 は x の2乗を表します)

演算子の優先順序に注意しましょう。 心配なときは (…) でグルーピングするとよいでしょう。

1 + x * 2        1 + (2 * x)  として計算される
2**x + 1         (2**x) + 1 として計算される
2**(x + 1)       2**(x + 1) として計算される

円周率πが定数として組み込まれています。

pi  3.1415…

整数同士の計算

Gnuplot では整数と実数(浮動小数点数)が区別され、整数同士の演算では整数の範囲内で計算が行われます。 例えば、整数同士の割り算 7/3 は答えが 2 となります。 次の例を試してみましょう。 (C-p で以前の入力を再利用できます。)

gnuplot> print 1 / 3
gnuplot> print 2 / 3
gnuplot> print 3 / 3
gnuplot> print 4 / 3
gnuplot> print 5 / 3
gnuplot> print 6 / 3

7/3 = 2.333…という結果が欲しい場合は、7 か 3 のどちらかを実数(浮動小数点数)にします。 7.0 は 0 を省略して 7. と書くこともできます。

gnuplot> print 7.0 / 3
gnuplot> print 7 / 3.
gnuplot> print 7. / 3.

この例からわかるように、7.0/3, 7/3.0 では整数が実数(浮動小数点数)に変換されてから計算され、7.0/3.0 と同じ意味になります。

整数が x などの変数と組み合わされて使われる場合は、x が実数と解釈されるので、整数は自動的に実数に変換されます。

x + 2         ->  x + 2.0 と同じ
2 * x         ->  2.0 * x と同じ
x + 1/2       ->  x + 0 と同じ(要注意!) x + 0.5 と書かないといけない。

練習

次の関数をプロットしてみましょう。

グラフがガタガタになってしまう場合は set samples でサンプリング数を増やして下さい。

gnuplot> set samples 2000
gnuplot> plot sin(x)+sin(3*x)/3+sin(5*x)/5+sin(7*x)/7+sin(9*x)/9

最後の例は矩形波(凹凸状の関数)のフーリエ級数展開になっています。 グラフがジャンプしている付近のデコボコは項の数をどんなに増やしても消えません。 これを「ギブス現象」といいます。

グラフを描いてみる (2)

作図範囲の指定

作図範囲(x 軸と y 軸の範囲)を指定するには set xrange, set yrange コマンドを使います。 値の範囲は [上限:下限] のように指定します。 x 軸の範囲を から にする場合は

gnuplot> plot sin(x)
gnuplot> set xrange [-pi:pi]
gnuplot> replot

とします。 replot コマンドを使うと、グラフを新しい範囲で描き直してくれるので、範囲をいろいろ変えながらプロットする場合には便利でしょう。 y 軸の範囲についても同様です。

作図範囲の指定を取り消す場合は unset xrange (yrange) コマンドを使います。

gnuplot> unset xrange

set xrangeset yrange を使わずに範囲を指定することもできます。 plot コマンドに続けて x の範囲と y の範囲を指定すれば OK です。

plot [xの範囲] [yの範囲] 関数1, 関数2, ...

[yの範囲] は省略することもできます。 sin(x), tan(x) のグラフを x の範囲 (-2π, 2π), y の範囲 (-5, 5) でプロットするには次のようにします。

gnuplot> plot [-2*pi:2*pi] [-5:5] sin(x), tan(x)

グラフに名前をつける

plot コマンドに title オプションを指定するとグラフに好きな名前をつけることができます。

gnuplot> plot sin(x) title "f(x)"
gnuplot> plot sin(x) title "f(x)", cos(x) title "g(x)"

title "" とするとグラフ名の表示を消すことができます。

gnuplot> plot sin(x) title ''

サンプル数の設定

グラフ表示のサンプル数(何点を使ってグラフを描くか)を set samples で設定できます。 不連続な点の近くで関数を描く時は大きめのサンプル数を指定するとよいでしょう。

gnuplot> set samples 10
gnuplot> plot [0:pi] [-10:10] tan(x)
gnuplot> set samples 1000
gnuplot> plot [0:pi] [-10:10] tan(x)

描画スタイルの変更

plot コマンドに with オプションを指定すると、いろいろなスタイルで関数をプロットすることができます。

gnuplot> plot sin(x) with points

他にも

など、いろいろなスタイルが用意されています。 試してみましょう。

スタイルを一括して変更するには set function style を使います。 ステップ(階段)関数で表示するには

gnuplot> set style function steps
gnuplot> plot sin(x)

とします。 デフォルトの設定に戻すには reset コマンドを使います。

対数プロット

対数軸で関数をプロットすることも可能です。

gnuplot> plot exp(x)
gnuplot> set logscale y
gnuplot> replot

対数プロットをやめるには

gnuplot> unset logscale y

とします。

x 軸と y 軸の両方を対数プロット(両対数軸)にするには

gnuplot> set logscale xy

とします。

データファイルのプロット

基本

Gnuplot は次のような形式のテキストデータをプロットすることもできます。 実験データのプロットなど、こちらのほうが応用範囲が広いでしょう。

# SOI index
1935.500     0.2
1935.583     0.1
1935.667     0.1
…

データファイルのフォーマットは次のようになっています。

サンプルデータを作業ディレクトリにコピーしてプロットしてみましょう。 まず、ターミナルで次のコマンドを実行します。

$ cp ~mtkg/comp_A/soi_anom.dat ./

Gnuplot の plot コマンドでプロットします。

gnuplot> plot "soi_anom.dat"

データファイルをプロットする際のデフォルトのスタイルは points です。 別のスタイルを指定するには with オプションを使います。

gnuplot> plot 'soi_anom.dat' with linespoints (または w lp) 点を線で結ぶ
gnuplot> plot 'soi_anom.dat' with lines       (または w l)  線で結ぶ(点は描かない)
gnuplot> plot 'soi_anom.dat' with impulses  (または w i)

using オプション

今度はもっとたくさんデータがある場合を考えてみましょう。 trig.dat は三角関数の表になっており、データが x, sin(x), cos(x), tan(x) の順に並んでいます。

#             X         SIN(X)         COS(X)         TAN(X)
    0.00000E+00    0.00000E+00    0.10000E+01    0.00000E+00
    0.17453E-01    0.17452E-01    0.99985E+00    0.17455E-01
    0.34907E-01    0.34899E-01    0.99939E+00    0.34921E-01
    0.52360E-01    0.52336E-01    0.99863E+00    0.52408E-01
    …             …             …             …

ターミナルで次のコマンドを実行し、データファイルを自分の作業ディレクトリにコピーしてください。

$ cp ~mtkg/comp_A/trig.dat ./

plot コマンドで trig.dat をプロットすると sin(x) のグラフが表示されます。 with line オプションを使うとデータ点が直線で結ばれて表示されます。

gnutplot> plot "trig.dat"
gnutplot> plot "trig.dat" with line   (または w l)

using オプションを使うと3列目や4列目のデータをプロットすることができます。

using (x座標とする列番号):(y座標とする列番号)

cos(x) をプロットするには1列目の値を x 座標、3列目の値を y 座標にすればよいので、using 1:3 とします。

gnuplot> plot "trig.dat" using 1:3

cos(x) の値を x 座標、sin(x) の値を y 座標にするとどんなグラフになるでしょうか? 次のコマンドを試してみてください。

gnuplot> plot "trig.dat" using 3:2

データの値の参照

$1, $2, …という表記方法を使うと using オプションの中でデータの値を参照することができます(数字はデータの列番号)。 sin(x)/x のグラフをプロットするは、xの値(1列目の値)に対して「2列目の値÷1列目の値」をプロットすればよいので、次のように書けば OK です。

gnuplot> plot "trig.dat" using 1:($2/$1)

$1, $2 という表記法法を使う場合は (…) で式をくくってやる必要があります。

練習問題

(x*cos(x), x*sin(x)) の軌跡をプロットせよ。

解答: x*cos(x)$1*$3, x*sin(x)$1*$2 となります。 したがって、次のコマンドでプロットすることができます。

gnuplot> plot "trig.dat" using ($1*$3):($1*$2) w l

3次元プロット

基本

splot コマンドを使うと2変数の関数 z = f(x,y) のグラフをプロットすることができます。 f(x,y) は山の高さや地表面気圧の分布を表すような関数だと思えばよいでしょう。

gnuplot> splot sin(x/5)*cos(y/5)

set pm3d コマンドでカラーマップを使った3次元表示が可能です。

gnuplot> set pm3d
gnuplot> splot sin(x/5)*cos(y/5)

set view コマンドで視点を変更することができます。

gnuplot> set view 50,60
gnuplot> replot

このようにすると、画面に対して右向きが x 軸、上向きが y 軸、手前方向が z 軸であった座標系を、x 軸周りに50度、z 軸周りに60度回転させたグラフの射影像が得られます。 view コマンドはあと2つの引数を取ることができます。 その意味についてはオンラインマニュアルなどを参照してください。

コンター(等高線)プロット

等高線図を描くには set contour コマンドを使います。

gnuplot> set contour
gnuplot> splot sin(x/5)*cos(y/5)

等高線をグラフの曲線上に重ねるには surface オプションを指定します。

gnuplot> set contour surface
gnuplot> replot

等高線の描き方を変更するには cntrparam の値を調整します。 例えば、等高線の刻みを 20 に増やしたい場合は

gnuplot> set cntrparam levels auto 20

とします。

x-y 平面に等高線だけを表示するには、次のようにするとよいでしょう。

gnuplot> unset surface
gnuplot> unset ztics
gnuplot> set view 0, 0
gnuplot> splot sin(x/5)*cos(y/5)

本日の課題

  1. 2次関数 x*x-1 のグラフを [-3:3] の範囲でプロットせよ。
  2. 3次関数 (x-1)*x*(x+1) のグラフを [-3:3] の範囲でプロットせよ。
  3. y 軸の範囲を [-2:2] として、上の2つの関数を同時にプロットせよ。
  4. sin(x), x, sin(x)/x を重ねてプロットせよ。見やすい値の範囲を工夫すること。
  5. trig.dat を使って (cos(x)**3, sin(x)**3) の軌跡を描け。
  6. trig.dat を使って (cos(x)**1, sin(x)**5) の軌跡を描け。