(一般の方への注)この文書は内部資料です。 今のところアクセス制限などはしておりませんが、リンクはご遠慮いただけると幸いです。 また、無断転載は禁止します。 (2002年11月。物理工学科助手:星健夫)
(改訂記録)2003年8月:私的に多少の改訂を行う(星)。



物理工学実験「数値計算と数値シミュレーション」参考資料

GNUPLOTによる数値データのグラフ化
(力学系研究室編, 2002年冬学期)

0、はじめに

ここでは(標準的なUNIX環境上の)gnuplotを用いて、 「数値データをxyプロット形式のグラフにする」、という作業を考えます。 (この文章は、gnuplot Ver.3.7を前提に書いています)

この文章は、以下の内容からなります(第1章から順に読むことを想定しています)。
  1. 起動と終了、ヘルプ、UNIXコマンドの実行
  2. グラフの描画
  3. グラフの装飾
  4. グラフの印刷
  5. スクリプトファイルによるバッチ処理
  6. 簡易アニメーション
  7. 様々なグラフの描き方
以下、数値データは「data.txt」というファイルに入っているものとします。 「data.txt」は、以下のようなテキストファイルとします。

1.2    1.5        2.3
1.3    1.6        2.2
1.4    1.7        2.2
1.5    1.75      2.5
データの間には、空白(スペース)をいれておく必要があります。


1、起動と終了、ヘルプ、UNIXコマンドの実行

gnuplotの操作はすべて、コマンド入力で行います。起動するには、UNIXコマンドライン上で、

>gnuplot
と入力します。以下のような文章が出るでしょう(実際とは多少違うことがあります)。

G N U P L O T
Unix version 3.7
patchlevel 1 (+1.2.0 2001/01/11)
last modified Fri Oct 22 18:00:00 BST 1999

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

Type `help` to access the on-line reference manual
The gnuplot FAQ is available from
http://www.ucc.ie/gnuplot/gnuplot-faq.html

Send comments and requests for help to info-gnuplot@dartmouth.edu
Send bugs, suggestions and mods to bug-gnuplot@dartmouth.edu


Terminal type set to 'x11'
gnuplot> 
これでgnuplotのコマンドラインになりました。 試しに、

gnuplot> plot sin(x)
と入力してみましょう。 別ウィンドウが開いて、三角関数が描画されているはずです。

終了するには、コマンドラインのウィンドウに戻って、

gnuplot> exit
と入力します。UNIXコマンドラインに戻れます。

この文章では、gnuplotの代表的の使い方だけをとりあげています。 各機能の詳細な解説は、「help」コマンドを活用してください。 たとえば、

gnuplot> help plot
とやると、(第2章で説明する)plotコマンドに関する解説が見られます。また、

gnuplot> help
で、項目の一覧がでます。 個々の解説文は、スペースキーでスクロールし、 「B」キーでバックスクロールします。 スクロールは、画面下に「(END)」が出るまで続きます。 ここで「q」を押すと、

Help topic: 
または、

Subtopic of set:
と出て入力待ちになります。項目名を入力すれば、その項目のヘルプが出ます。 何も入力せずにリターンキーを押せば、一つ上位のカテゴリーへと抜けられ、 これを繰り返すことでヘルプ全体から抜けられます。

gnuplotのコマンドラインとUNIXコマンドラインは、本来別のものです。 しかし、最初に「!」をつければ、 gnuplotのコマンドラインから、UNIXコマンドを実行できます。 たとえば、

gnuplot> !mule data.txt
とすれば、muleが起動し、ファイルの編集ができます。 [第1章終]


2、グラフの描画

さっそく、グラフを書いてみましょう。 「1列目のデータをx軸に、2列目のデータをy軸にとったグラフ」、を書くには、gnuplotのコマンドラインで以下のように入力します。

gnuplot> plot 'data.txt' using 1:2 title 'graph1' with linespoints
「graph1」というタイトルのグラフが描けました (タイトル表示は省略できます)。 ここで「with linespoints」は、「点と線で描画する」という意味です。 なお、「using」「title」「with」は、 この順番で書かないとエラーになるようです。

線や点の種類を設定するときは、例えば以下のように、末尾に2つの数字を付加します。

gnuplot> plot 'data.txt' using 1:2 title 'graph1' with linespoints 5 3
最後の2つの数字のうち、1つ目(上では「5」)が線種を、 2つ目が(上では「3」)が点種をあらわします。 線種は1から9まで指定でき、 「1=赤」「2=緑」といった具合に色をあらわします。 ただし、白黒プリンタに出力するときは、「1=実線」になり、 2以降は種々の破線や点線になります。 一方、点種は1から6まで指定でき、 「1=菱形」「2=十字形」といったように記号をあらわします。

with」部分を以下のように変えることで、多彩なグラフが描けます (省略すると「with points」が仮定されます)。

with points ←点で描画する
with lines ←線で描画する
with boxes ←棒グラフに描画する
with steps ←階段状に描画する
with impulses ←インパルス(垂線)で描画する
with dots ←小さな点で描画する(データ点が極めて多数あるときに有用)
なお、「with points」で描く際も、点種を指定するには、

gnuplot> plot 'data.txt' using 1:2 title 'graph1' with points 5 3
と、書かねばなりません。この場合、線種に相当する値(上では「5」)は無視されます。

今度は、 「1列目のデータをx軸に、2列目のデータと3列目のデータをy軸にとったグラフ」、 を書きましょう。以下のようなコマンドで実行できます。

gnuplot> plot 'data.txt' using 1:2 title 'graph1' with lines,'data.txt' using 1:3 title 'graph2' with lines
2本のグラフが描けたでしょう。 さらに、データファイルをちょっと書き換えて

1.2    1.5        2.3
1.3    1.6        2.2

1.4    1.7        2.2
1.5    1.75      2.5
としてみましょう。2行目と3行目の間に改行をいれただけです。 このデータを「linespoints」で同様にグラフ化してみましょう。 2番目のデータと3番目のデータの間には、線が引かれていません。 「lines」のときも同様です。

慣れてくると、長いコマンドをいちいち入力するのが面倒になるかもしれません。 そんな場合には、省略形を用いると良いでしょう。 たとえば、

gnuplot> pl 'data.txt' u 1:2 w lp
は、

gnuplot> plot 'data.txt' using 1:2 with linespoints
と等価です。

描いたグラフを消去するときは、以下のコマンドで実行できます。

gnuplot> clear
さらに多彩なグラフの描き方については、 第7章で扱います。 [第2章終]

3、グラフの装飾

最低限のグラフの描き方は上記で終わりです。 ここでは、装飾の設定を手動で行います。

まず、描画範囲を手動で設定しなおしましょう。 グラフが描かれている状態で、以下のように入力します。

gnuplot> set xrange [1:1.6]
gnuplot> set yrange [1:3]
gnuplot> replot
これで、x軸の範囲が[1,1.6]に、y軸の範囲が[1,3]に設定されたグラフが描けます。 最後の「replot」は、「直前に行ったplot命令を再実行する」というコマンドです。

さらに、

gnuplot> set grid
gnuplot> replot
としてみましょう。目盛の位置に線が引かれます。 線を消したければ、「grid」の代わりに 「nogrid」として同様に設定します。

目盛の位置も手動で設定しましょう。

gnuplot> set xtics 1.1, 0.1, 1.3
gnuplot> replot
と実行してみましょう。 これは、「x軸上で、1.1から1.3までを、0.1刻みで目盛を指定せよ」という意味です。 結果として、「x=1.1, 1.2,1.3」の3か所に目盛が刻んであるはずです。 y軸についても「ytics」として、同様の設定ができます。

これとは別に、目盛を一つ一つ設定する方法もあります、

gnuplot> set xtics (1.1, pi/2, 1.3)
gnuplot> replot
何がプロットされたかは、お分かりでしょう。 ただし、これでは、円周率が有限桁の小数で表示されてしまいます。 その場合、

gnuplot> set xtics (1.1, "PI/2" pi/2, 1.3)
gnuplot> replot
とすれば、良いでしょう。 なお、ここでの円周率(「pi」)は、適当に打ち切られた値が入力されるようなので、 気をつけてください。

数値の表示桁数まで設定したい場合は、以下のように設定します。

gnuplot> set format x "%7.3f"
gnuplot> set xtics (1.1, pi/2, 1.3)
gnuplot> replot
ここで「"%7.3f"」は、「全体では7桁、小数点以下3桁」という形式です。 「 format x ""」は、目盛だけ表示され、数値は表示されません。 デフォルト値(自動設定された値)に戻したいときは、 以下のように、指定無しで「xtics」を行います。

gnuplot> set xtics
gnuplot> replot
グラフの装飾について、他のコマンドをまとめておきます。 「x」を「y」に変えれば、y座標の設定になるのは、言うまでもないでしょう。
set noxtics ←目盛を表示しない
set logscale x  ←対数軸に設定する。
set nologscale x  ←上記コマンドのキャンセル。
set xzeroaxis 1  ←y=0の位置に、線を引く。
           最後の数字(例では「1」)は、線の種類(第2章参照、例では実線になる)で、省略可。
set title "example"  ←グラフにタイトルをつける。例では「example」。
set xlabel "data 1"  ←x軸にタイトルをつける。例では「data1」。
set size 0.721,1.0  ←グラフのサイズを変更する。例では、x方向に0.721倍、y方向に等倍する。
            この例の場合、グラフがちょうど正方形になる。
set size square  ←グラフがちょうど正方形になる。(古いバージョンのgnuplotでは、未サポート)
設定した環境パラメータを見たい場合は、 「set」のかわりに「show」を使います。 例えば、「show title」とすれば、 現在設定されているタイトル(上の例では「example」)が表示されます。 「show all」で全ての環境パラメータを表示できます。 この場合、自動設定されている環境パラメーターも全て表示されますので、 (ここで説明していない環境パラメーターも含めた)長いリストが表示されます。 [第3章終]

4、グラフの印刷

グラフの印刷は、 「グラフを一旦画像ファイル(PostScript形式)で保存して、そのファイルを印刷する」、 という手順で行います。
まず、以下のように、出力先を設定します。

gnuplot> set output "graph.ps"
gnuplot> set terminal postscript
この後、これまでと同様に描画コマンドを実行していきます。 今度は、グラフが画面に現れません。 代わりに、「graph.ps」というファイルが、ディレクトリ上にできています。 このファイルを印刷します(印刷の仕方は別紙を見て下さい)。

画面への表示に戻したいときは、

gnuplot> set terminal x11
とします。 実は、gnuplot起動時には、暗黙のうちに上記のコマンドが実行されています。 起動時の画面の最後に、

Terminal type set to 'x11'
とでているのが、それに相当します。

これで、最低限の印刷手順は終わりです。以下は飛ばしても構いません。

グラフは通常、A4横向きに出力されます。縦向きに印刷する場合は、

gnuplot> set terminal postscript portrait
と指定します。ちなみに、横向きの指定を明示的に行うには、 「portrait」の代わりに「landscape」とします。

次に、線種の手動設定を考えます。 第2章で見たように、白黒プリンターで印刷する場合、 線種は「1=実線」になり、2以降は種々の破線や点線になります。 これだと、たくさんの線が描かれる場合に、見にくいかもしれません。 そこで、これらの線種を「太さの違う実線」に変えることを考えます。

gnuplot> set terminal postscript
gnuplot> set linestyle 1 linetype 1 linewidth 1.0
gnuplot> set linestyle 2 linetype 1 linewidth 2.0
linetype 1」が実線を指し、 「linewidth」で線幅の倍率を指します。 こうして定義したのち、以下のようにグラフを描きます。

gnuplot> plot 'data.txt' using 1:2 with lines 1 linestyle 1,'data.txt' using 1:3 title 'graph2' with lines  linestyle 2
太さの違う2種類の実線で、グラフが描けたはずです。 「linespoints」で描く場合の点種も、同様に定義できます。 例えば、

gnuplot> set terminal postscript
gnuplot> set linestyle 1 linetype 1 linewidth 1.0 pointtype 2 pointsize 5.0
gnuplot> set linestyle 2 linetype 1 linewidth 2.0 pointtype 7 pointsize 1.0
のように定義したのち、上と同様のグラフを「linespoints」で描いてみて下さい。

次は、添字やギリシャ文字の印刷についてです。 これらは、画面(x11)描画では不可能らしく、正しく表示されません。 印刷する場合は、以下のように、 ファイル形式を「postscript enhanced」と設定することで可能になります。

gnuplot> set terminal postscript enhanced
この設定下において、以下のようにして出力できます。 ギリシャ文字は、対応するアルファベットで指定します。

a^{b}←「ab」と描画
a_{b}←「ab」と描画
a@^{b}_{c}←上下両方に添字が付く。
{/Symbol G}←「Γ」(ガンマ)と描画
{/Symbol g}←「γ」(ガンマ)と描画
ちなみに、アルファベットとギリシャ文字の対応は、以下です。 (物理でよく使われるものだけをあげてあります。)
α(a)、β(b)、γ(g)、δ(d)、ε(e)、ζ(z)、η(h)、θ(q)、κ(k)、λ(l)、 μ(m)、ν(n)、ξ(x)、π(p)、ρ(r)、σ(s)、τ(t)、 φ(f)、χ(c)、ψ(y)、ω(w)、
Γ(G)、Δ(D)、Θ(Q)、 Λ(L)、Ξ(X)、Π (P)、Σ(S)、Φ(F)、Ψ(Y)、Ω(W)、
応用例として、対数プロットを例にとります。 通常は「1」「10」「100」という風に描画されますが、これを 「100」「101」「102」といった、べき乗表示で印刷します。

gnuplot> set terminal postscript enhanced
gnuplot> set logscale y
gnuplot> set format y "10^{%L}"
gnuplot> set key spacing 1.4
gnuplot> plot 'data.txt' using 1:2, title "{/Symbol G}_{a}", plot 'data.txt' using 1:3  title "{/Symbol g}^{b}
ここで「set key spacing 1.4」は、 グラフタイトル間の改行間隔を1.4倍にとる、という意味です。 これを設定しないと、2つのグラフタイトル(「Γa」と「γb」)が重なってしまうでしょう。

次は、フォントの種類や大きさを指定します。全体を指定するには、例えば、

gnuplot> set terminal postscript enhanced "Times-Roman" 14
とします。 フォントは、"Helvetica"、"Times-Roman"、"Courier"、などが一般的のようです。 「14」というのは、14ポイントの大きさ、という意味です。 省略すると、「"Helvetica" 14」の設定になります。
文字ごとに指定することもできます。タイトルを例にします。 フォントの大きさを絶対値で指定するには、

gnuplot> set title  "{/Times-Roman=40 G} {/Courier=40 G} {/Helvetica=40 G} {/Symbol=40 G}"
とします。印刷してみると、 タイトル欄に、3つの「G」と一つの「Γ」が現れたはずです。 このときの文字サイズが40になっています。 一方、フォントの大きさを相対値で指定するには、

gnuplot> set title  "{/Times-Roman*2.0 G} {/Courier*2.0 G} {/Helvetica*2.0 G} {/Symbol*2.0 G}"
とします。印刷してみると、 文字サイズが(全体に対する設定より)2倍になっています。 いろいろなフォントを組み合わせると、例えば、こんなことができます。

gnuplot>set title "{/Helvetica e}^{- {/Courier i} {/Symbol g}^2}"
最後に。上で述べた設定のうち、複数を同時に行う場合は、 指定の順番に気をつけてください。以下の順番で指定します。

gnuplot> set terminal postscript portrait enhanced  "Times-Roman" 14
[第4章終]

5、スクリプトファイルによるバッチ処理

以上で簡単な使用法は、終わりです。 しかし、慣れてくると、いちいちコマンドを打ち込むのが面倒になるかもしれません。 その場合、「ファイルにコマンドをまとめて書いておいて、それを実行させる」、 というのが便利です。 このファイルを「スクリプトファイル」と言います。 スクリプトファイルには、gnuplotのコマンドを列挙しておきます。

最初に、環境パラメータをまとめて設定することを考えます。 例えば、以下の内容のファイルを「myset.txt」として用意します。

set xrange [1: 1.6]
set yrange [1: 3]
set xlabel "data0"
set title "example"
gnuplot起動後、以下のようなコマンドを実行します。 装飾の施されたグラフが描画されるでしょう。

gnuplot> load "myset.txt"
gnuplot> plot 'data.txt' using 1:2 title 'graph1' with lines
次に、グラフ描画まで自動で行うことを考えます。 例として、以下の内容のファイルを「batch.txt」として用意します。

set terminal x11
#set terminal postscript
set output "graph.ps"
load "myset.txt"
plot 'data.txt' using 1:2 title 'graph1' with lines,'data.txt' using 1:3 title 'graph2' with lines
pause -1 "Hit return to end"
ここで、頭に「#」がつく行(上の例では2行目)は、無視されます。 また、「pause -1 」は、 「リターンキーが押されるまで永久に待つ」、という意味です。 この行がないと、一瞬グラフが描かれるがすぐに終了してしまう、ということになります。
1行が長過ぎて見にくい場合は、「\」を使って、 2行にまたがって書いても構いません。 上の例で行くと、最後から2行目は、以下のように書き直しても構いません。

plot 'data.txt' using 1:2 title 'graph1' with lines,\
'data.txt' using 1:3 title 'graph2' with lines
なお「\」は、マシン環境によって、 円記号(¥)または バックスラッシュ(\) として(半角で)表示されます。
上記ファイルを用意したら、 UNIXコマンドラインで、以下のように実行します。

> gnuplot batch.txt
コマンドラインには「Hit return to end」という文字が表示されているでしょう。 ここでコマンドラインでリターンキーを押すと、gnuplotが終了します。

このグラフを(印刷するために)PostScriptファイルにしたい、という場合もあるでしょう。 そのときは、上記スクリプトファイルの最初の2行を書き換えて。

#set terminal x11
set terminal postscript
とします。これで画面に描画される代わりに、 「graph.ps」というファイルに出力されます。 この場合は、最終行の頭に「#」をつけて、

#pause -1 "Hit return to end"
としておく方が良いでしょう。 「「Hit return to end」を見てからリターンキーを押す」、 という作業を経ずに、即座にファイルが作成されます。

[参考] 実は、gnuplotコマンドラインで一つ一つ手入力した種々の設定を、 ファイルに保存することができます。

gnuplot> save 'save.txt'
とすれば、「save.txt」というファイルに保存されます。 このファイルは、スクリプトファイルに相当し、gnuplotコマンドライン上で

gnuplot>load 'save.txt'
とすれば、以前描いたグラフが、ふたたび描かれます。 ただし、ここで作られるファイル(この例では「save.txt」)は、 用意されている環境パラメータが全て書かれた、長々としたファイルです (エディタなどで見てみれば、分かります)。 見にくいので、この方法は、あまり勧めません。 [第5章終]

6、簡易アニメーション

スクリプトファイルの応用として、簡易アニメーションを作ることを考えます。 「次々にグラフを描きかえていく」という作業をすれば良いのです。 「ani.txt」として、以下のファイルを用意します。 ここで、「pause 1 」は「1秒待つ」というコマンドです。

load "myset.txt"
plot "data.txt" using 1:2 title "graph1" with lines
pause 1
plot "data.txt" using 1:3 title "graph2" with lines
pause 1
plot "data.txt" using 1:2 title "graph3" with lines
pause 1
plot "data.txt" using 1:3 title "graph4" with lines
pause 1
plot "data.txt" using 1:2 title "graph5" with lines
pause 1
plot "data.txt" using 1:3 title "graph6" with lines
pause -1 "Hit return to repeat"
load "ani.txt"
アニメーションは、 UNIXコマンドラインから、以下のように実行します。

> gnuplot ani.txt
1秒おきに6枚のグラフが連続して描かれ、その後、 コマンドラインに「Hit return to repeat」が出て入力待ちになるでしょう。 ここでリターンキーを押すと、アニメーションが繰り返されます。 これは一種の無限ループになっています。 終了したいときは、(リターンキ−を押す代わりに) 「C-c」(コントロールキーを押しながら「c」を押す) を入力し、gnuplot自体を強制終了させます。 [第6章終]

7、様々なグラフの描き方

第2章でとりあげた以外にも、様々なグラフを描くことができます。 ここでは、いくつかを紹介します。

(a)エラーバーが付いたグラフを描く

エラーバーが付いたグラフを描くには、データファイルの形式を、 行ごとに以下のように書かねばなりません。

(x座標)  (主データ)  (エラーバーの下限値)  (エラーバーの上限値)
たとえば、「data2.txt」として、以下のようなファイルを作成します。

1.0    2.0    1.9    2.1
1.1    2.2    1.5    2.3
1.2    2.1    2.0    2.2
1.3    1.9    1.8    2.2
gnuplotコマンドラインで、

gnuplot>plot 'data2.txt' with errorbars
と入力すれば、エラーバー付きのグラフが描かれます。

(b) 2つのY座標をもつグラフを描く

(この機能は、古いバージョンのgnuplotでは未サポートのようです)。
左右に別々のy座標を割り当てたグラフを描きます。 「y」の代わりに「y2」と指定します。 例を示すので、それで理解できると思います。

gnuplot> set yrange [1:2]
gnuplot> set y2range [2:3]
gnuplot> set y2tics
gnuplot> set grid
gnuplot> plot 'data.txt' using 1:2 axes x1y1,'data.txt' using 1:3 axes x1y2
ここで「set y2tics」を書かないと、 y2座標(グラフの右側)の目盛には、数値が現れないようです。

同様に、2つのx座標を(上下に)もつこともできます。

(c) 1ページに複数のグラフを描く

(この機能は、古いバージョンのgnuplotでは未サポートのようです)。
gnuplotのコマンドラインで、

gnuplot> set multiplot
とすると、コマンドライン表示が 「gnuplot> 」から「multiplot> 」に変わります。 後は、以下の例を試してみれば、理解できるでしょう。

multiplot> set origin 0,0
multiplot> set size 0.5,0.5
multiplot> plot 'data.txt' using 1:2 title 'graph1' with lines
multiplot> set origin 0,0.5
multiplot> set size 0.5,0.5
multiplot> plot 'data.txt' using 1:3 title 'graph2' with lines
set nomultiplot」で元に戻ります。 [第7章終]
Written by 東京大学工学部物理工学科力学教室(2002年冬学期)