前回、gnuplotのインストール方法や基本的な文法をサクッと見てきました。 今回は、サンプルを使用してグラフ作成の流れを追っていきます。
まずは基本をおさえ、つぎに制御構文の使い方を説明します。

シンプルな例を用いているので、ぜひ自身の環境で手を動かしながら理解を深めてください。

使い方(基本)

サンプル1

中学のときに習った次の一次式をプロットしてみます。

y = x

まず、2次元のグラフなので、 plot を使います。

plot x


こんなグラフが出力されたと思います。
この x というのは、X軸の値をとる特別な変数名です。

X軸の範囲は、デフォルトで -10 〜 10 です。
一方、Y軸の範囲は、この例では -10 〜 10 となっていますが、 autoscale というのがデフォルトでONになっているので、出力内容によって自動的に変わります。

自身の環境でグラフが出力されない場合は、出力先デバイスを確認してみてください。

show term

サンプル2

X軸とY軸の範囲を変えてみます。今度は次の式をプロットします。

y = x3

書式は、前回の plot の項をご参照ください。

#(再掲)
plot {ranges} <function> {title}{style} {,<function> {title}{style}...}
plot [-20:20] [-5000:5000] x**3

‘[-20:20] [-5000:5000]’ の部分が {ranges} に相当します。
[]内は、コロンで区切り、’[<最小値>:<最大値>]‘のように設定することが可能です。
また、最小値のみ、あるいは、最大値のみを設定することもできます。
このケースでは、X軸の範囲を -20 〜 20、Y軸の範囲を -5000 〜 5000 に設定しています。


X軸の範囲だけ指定するときは、次のようにします。いずれも同じ結果となります。

plot [-20:20] x**3
plot [-20:20] [] x**3
plot [-20:20] [:] x**3

Y軸だけ範囲指定するときは、以下のように書きます。

plot [] [-5000:5000] x**3
plot [:] [-5000:5000] x**3

サンプル3

では、サンプル2にグリッドを追加してみます。

set grid xtics ytics
plot [-20:20] [-5000:5000] x**3

このように、 set grid 構文を使用します。
X軸だけ経線を入れたくなったら、一旦unset grid してすべてのgridを削除後、 set grid xtics とします。


gridを追加しただけで、サンプル2と比べ、とても見やすくなりました。

サンプル4

サンプル3にもうひとつ関数をひとつ追加してみます。

set grid xtics ytics
plot [-20:20] [-5000:5000] x**3, -x**3

書式(plot)の <function>{,<function>} に当たる部分が、 x**3, -x**3 です。
このように、<function> のところにカンマ区切りで式を追加すると、ひとつのプロットエリア内に複数の直線/曲線を描くことができます。

サンプル5

3項演算子を使ってプロットします。

plot abs(x) >= 5 || abs(x) <= 2 ? x : 1/0

xの値によってプロットの有無を制御しています。
1/0 は、プロットしたくないときによく使う書き方です。他に、NaN と書いても同じです。


-5 < x < -2 と 2 < x < 5 の区間だけ線が消えました。
特に plot 'data_file' の構文では、3項演算子は頻繁に使用されるので、覚えておいて損はないと思います。

使い方(制御構文)

ここから、if/else や loop処理 などの制御構文を見ていきます。

if/else

まず、基本的な if/else のサンプルです。

hh = strftime("%H", time(0)+9*3600)
if(hh < 11){
	greet = 'おはよう'
} else {
	if(hh < 17){
		greet = 'こんにちは'
	} else {
		greet = 'こんばんは'
	}
}
print greet

1行目で、現在の日本時間(24時間表示)を取得し、つぎに、if文 で時間帯に適した挨拶文をgreetにセットしています。
最後に print greet で標準出力に挨拶を表示しています。
この例では、plot を使用していないのでグラフは描画されません。

※ 現バージョン(5.2.2)では、else if(<condition>){} がまだ使えないので、上記のように入れ子にしてあります。

for

つぎは、for 文です。
forplot, splot, set, unset の各構文内で使用できます。構文は次の二つです。

for [intvar = start:end{:increment}]
for [stringvar in "A B C D"]

例)

plot for [i=1:10] i*x**2 title sprintf("%d*x**2",i)

“sprintf()“はC言語の仕様と同じです。

また、以下のように、 for 文を入れ子にすることもできます。

plot for [i=1:10:2] for [j=-1:1:2] i*j*x**2 title sprintf("%d*%d*x**2",i,j)

do

do の構文は次の通りです。

do for <iteration-spec> {
	<commands>
	<commands>
}

このとおり、dodo for の形で使います。
上で見た forplot などの構文内でだけ使用できるのに対し、 do for は一般的なループ構造と同じなので、{}内で任意のコマンドを実行できるという違いがあります。

n = 1000
array A[n]
do for [i=1:n:2] {
	A[i] = cos(i * pi/100.)
}
plot A

ループで配列Aに値をセットして、最後に配列Aをプロットしています。
この array A[] は、バージョン5.2 で登場しました。使いどころが多いのではないかと思います。

while

while 構文はこの通りです。

while (<expr>) {
	<commands>
}

1から100までの合計を求めてみます。

t = 0
i = 1
while(i <= 100){
	t = t + i
	i = i + 1
}
print t

ループ構文の中では、while が最も汎用性が高そうです。

まとめ

以外と簡単だったのではないでしょうか。まだ、色や線種などのスタイルのカスタマイズなどに触れてないのですが、このページの内容を押さえておけば、ある程度使えると思います。
次回はもう少し実用的な例をご紹介する予定です。