gnuplot によるグラフ作成 - 弘前大学 Home Sweet Home

はじめに

この Notebook では,gnuplot_kernel (A Jupyter/IPython kernel for Gnuplot) を使って,関数およびデータのプロットプログラムである gnuplot の使用例を紹介する。

セクションの構成は,テキスト「wxMaxima による数式処理とグラフ作成」の「第2章 wxMaxima によるグラフ作成」や,「Sympy による数式処理とグラフ作成」の 「2 Sympy や Matplotlib によるグラフ作成」に準じているので,Jupyter Notebook の活用例としてだけでなく,wxMaxima や SymPy,Matplotlib などのグラフ作成方法を比較するのに役立つかもしれない。


葛西 真寿(KASAI Masumi)           
弘前大学 大学院理工学研究科        
情報連携統括本部 情報基盤センター

演算子・定数・関数

gnuplot では以下のような(FORTRAN と同じような... と言っても,もはや通じない)演算記号を使うことができる。

足し算 +,引き算 -,かけ算 *,割り算 /,べき乗 **

print コマンドを使えば,以下のように簡易電卓として使うこともできる。

In [1]:
print 12**2
Out[1]:
144

数の表現方法も(FORTRAN と同様であり... と言っても通じない),整数と実数がある。

In [2]:
print 1/3
Out[2]:
0
In [3]:
print 1./3
Out[3]:
0.333333333333333

非常に大きい数や,とても小さい数を表すには...

(例: $M = 5.972 \times 10^{24}, q = 1.0.6 \times 10^{-10}$)

In [4]:
M = 5.972e24
q = 1.6e-19

gnuplot には定数として円周率 pi がはじめから組み込まれている。

In [5]:
print pi
Out[5]:
3.14159265358979

また、組み込み関数としてよく使われるものをあげると,

sqrt(x)= $\sqrt{x}$ abs(x)= |$x$|
exp(x)= $e^x$ log(x)= $\log_e x$ log10(x) = $\log_{10} x$
sin(x) cos(x) tan(x)
sinh(x) cosh(x) tanh(x)
asin(x)=$\arcsin x$ acos(x)=$\arccos x$ atan(x)=$\arctan x$

gnuplot には,このほか,ユーザが自分で定数や関数を定義できる機能もある。定数については,上で定義した Mq の例がすでにあるので...

In [6]:
print M
Out[6]:
5.972e+24

関数を定義する例をあげる。組み込み関数 sin(x) に入れる x の値は radian 単位である。

In [7]:
print sin(30)
Out[7]:
-0.988031624092862

$\displaystyle \sin \frac{\pi}{6} = ...$

In [8]:
print sin(pi/6)
Out[8]:
0.5

以下のような関数 degsin(x) を定義してやると...

In [9]:
degsin(x) = sin(x*pi/180)
In [10]:
x = 30
print degsin(x)
Out[10]:
0.5

ユーザが定義した定数や関数は,gnuplot を終了すると忘れ去られてしまう。次回もまた使いたいときは,

save "defs.gpt"

などとして現在の定義をファイルに保存し,次に gnuplot を使うときに,

load "degs.gpt"

として読み込んでやればよい。

なお,このページのように Jupyter notebook を使えばユーザが定義した定数や関数,そして描画したグラフもすべて notebook に保存されるので,とても便利。

練習問題: 重力加速度の大きさ

gnuplot を電卓として用い,重力加速度の大きさ $g$ を求める。 地球の質量を$M$、半径を$R$、万有引力定数を$G$とすると、

$$\displaystyle \ g = \frac{GM}{R^2} $$

である。

$M = 5.972 \times 10^{24} \mbox{kg}$, $R = 6.378 \times 10^6 \mbox{m}$, $G = 6.672 \times 10^{-11} \mbox{N} \mbox{ m}^2/\mbox{kg}^2$ のとき、$g$はいくらか?

gnuplot によるグラフ作成

まず,ターミナルを開いて,シェルのプロンプトで gnuplot と入力し,Enter キーを押すと以下のようになる。


$ gnuplot

        G N U P L O T
        Version 5.4 patchlevel 0    last modified 2020-07-13 

        Copyright (C) 1986-1993, 1998, 2004, 2007-2020
        Thomas Williams, Colin Kelley and many others

        gnuplot home:     http://www.gnuplot.info
        faq, bugs, etc:   type "help FAQ"
        immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'qt'
gnuplot>   


以下では,Jupyter kernel for gnuplot を使っているので gnuplot のプロンプト gnuplot> は表示されない。

2次元グラフ plot の例

2次元グラフ $y = f(x)$ を $a \le x \le b$ の範囲で描く表記例は,plot [a:b] f(x) です。

例として,$y = \sin x$ のグラフを $-2\pi \le x \le 2 \pi$ の範囲で描きます。基本的な定数の一つである円周率 $\pi$ は gnuplot では pi と書きます。

In [11]:
reset
# 念の為`set` コマンドで定義できるグラフに関する
# 全てのオプションをデフォルトの値に戻します。

plot [-2*pi:2*pi] sin(x)
Gnuplot Produced by GNUPLOT 5.4 patchlevel 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 -6 -4 -2 0 2 4 6 sin(x) sin(x)

いくつかオプションを指定して描く例です。

以下では,座表軸を表示し,線の色(lc)を設定し,凡例(title)を表示させ,x軸とy軸にラベルを表示させて $y = \cos x$ を描いています。

In [12]:
set zeroaxis
set xlabel 'x'
set ylabel 'y'
plot [-2*pi:2*pi] cos(x) title '余弦関数' lc 2
Gnuplot Produced by GNUPLOT 5.4 patchlevel 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 -6 -4 -2 0 2 4 6 y x 余弦関数 余弦関数

$x$ の範囲と $y$ の表示範囲を両方指定してプロットする例。

In [13]:
plot [-pi:pi] [-2:2] tan(x)
Gnuplot Produced by GNUPLOT 5.4 patchlevel 0 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -3 -2 -1 0 1 2 3 y x tan(x) tan(x)

3次元グラフ splot の例

3次元グラフ $z = g(x, y)$ を描く一般的な表記例は splot [a:b] [c:d] g(x, y) です。

例として,$z = x \sin y$ のグラフを $-3 \le x 3, -4 \le y \le 4$ の範囲で描きます。

In [14]:
# 上記で設定したオプションをデフォルトに戻す
reset

splot [-3:3] [-4:4] x*sin(y) notitle
Gnuplot Produced by GNUPLOT 5.4 patchlevel 0 -3 -2 -1 0 1 2 3 -4 -3 -2 -1 0 1 2 3 4 -3 -2 -1 0 1 2 3 gnuplot_plot_1

デフォルトでは,splot は透明な曲面を描きます。曲面の重なった部分を非表示にしたい場合は,set hidden3d です。(解除するには,unset hidden3d です。)

曲面を滑らかにするには,isosamples の数値を増やします。

In [15]:
set hidden3d
In [16]:
show isosamples
Out[16]:
	iso sampling rate is 10, 10

In [17]:
set isosamples 50, 50
replot
Gnuplot Produced by GNUPLOT 5.4 patchlevel 0 gnuplot_plot_1