[GNUPLOT]データファイルからグラフを作る

実際に演習で必要となるグラフは、計算結果や実験結果をグラフ化するわけだから、数式を与えるのではなく、データファイルから作成することになるだろう。その方法を説明する。

[Hard!] 「急カーブ」のマークがついている節は、いくぶん高度な内容を扱っている。


* データファイルの形式

データファイルは、数字を空白(タブ、スペースなど。複数可)で区切って並べただけの、単純な形式にする。具体的には、次のようなデータがそうである。 (日本の総人口と、子供の人口のデータより)

# population
# year  total   kid
1935    6925    2555
1950    8411    2979
1960    9430    2843
1970    10467   2515
1975    11194   2723
1980    11706   2752
1985    12105   2604
1990    12361   2254
1995    12557   2003
1996    12586   1969
1997    12595   1951
1998    12635   1918

間に空白があれば、列がきれいにそろっている必要はない。1、2行目の、行頭が"#"ではじまっている行はコメント行で、GNUPLOTからは無視される。

演習の計算の場合は、計算結果のファイルの中から、必要な部分を見つけて切り出すことになるだろう。


* データファイルを元にグラフを描く

データファイル名が"population.dat"だとする。GNUPLOTに次のようなコマンドを与える。

gnuplot> plot "population.dat"

plotコマンドに、データファイル名をダブルクオート(二重引用符)で囲って与える(シングルクオートでも良い)。すると、下の図のようなグラフが表示されるはずである。

[Population #1]
データ列をグラフにした例1(日本の人口の推移)

データファイルの1列目を横軸に、2列目を縦軸に取ってグラフを描いていることが分かる。3列目以降を使う方法は後で述べることにし、まずはこのグラフを加工してみる。


* グラフの体裁の調整

* 味付け: タイトル、ラベルなど[Hard!]

上の図では何のグラフかまったく分からないので、グラフにタイトルをつけたり、x、y軸にラベルをつけるなどして加工してみる。

gnuplot> set title "Variation of Population in Japan"
gnuplot> set xlabel "Year"
gnuplot> set ylabel "Population (x 10,000)"
gnuplot> set grid
gnuplot> replot

GNUPLOTはグラフの体裁を変更するためのたくさんの"setコマンド"がある。はじめの3つのコマンドは、グラフにタイトルやラベルをつけるためのコマンドである。4行目の"set grid"は筆者の趣味で、グラフに格子線を張る。

[Population #2]
データ列をグラフにした例2(日本の人口の推移)

* 線グラフにする

データファイルをグラフにすると、標準では折れ線グラフではなく、上の図のようにマーカー(点)のグラフになる。折れ線グラフを描くには、次のようにする。

gnuplot> plot "population.dat" with lines

"with lines"は省略して"w l"でも構わない。ちなみに線も点も描きたいのであれば、"with linespoints"と書けばよい。

[Population #3]
データ列を折れ線グラフにした例(日本の人口の推移)

なお、ここまで来てもタイトルやラベルの指定が引き継がれていることに注意。 GNUPLOTを終了させたり、タイトル・ラベルの指定を取り消したり、明示的に異なるタイトル・ラベルを指定しないかぎり、指定は引き継がれる。

グラフの描き方を指定するsetコマンド[Hard!]

plotコマンドの範囲指定の場合と同じく、"with lines" の指定にも、同じ機能を持つsetコマンドがある。

gnuplot> set data style lines
gnuplot> plot "population.dat"

繰り返しになるが、setコマンドの指定は、これ以降のすべてのplot コマンドに引き継がれる。つまり、上のような指定をすると、それ以降に別の指定をしない限り、これ以降のプロットが折れ線グラフになる。


* 3列目以降のデータをグラフにする

上の例では、1列目を横軸に、2列目を縦軸に取った。データファイルには3列目(子供の人口の推移)があるので、それをグラフに描いてみる。

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

"using 1:3"の部分がポイントで、1列目を縦軸に、3列目を横軸に取るよう指定している。 "using 1:3"を省略して"u 1:3"でも構わない。

[Population #4]
データ列の3列目をグラフにした例(子供の人口の推移)

しつこいようだが、ここでもタイトルやラベルの指定が引き継がれていることに注意。また、縦軸の値の幅(値域)が自動的に変わっていることにも注意。ここがGNUPLOTの便利なところだ。


* 複数のデータ列を1つのグラフにする

はじめの節で、正弦関数と余弦関数を表示させるのに、次のようなコマンドを使った。

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

複数のデータ列を1つのグラフにするのも同じ要領で、カンマで区切って並べればよい。

gnuplot> plot "population.dat", "population.dat" using 1:3

[Population #5]
データ列の2列目と3列目をグラフにした例(人口の推移)

マーカーの色と形は、2つのデータ列でそれぞれ異なるものが使われる。

* 味付け: 凡例のラベル[Hard!]

上のグラフの右上についている、グラフのマーカーとデータとの対応を記した部分が「凡例」である。これを分かりやすく変えるには、プロットのときに凡例のラベルを指定すればよい。

gnuplot> plot "population.dat" title "Total", @BACKSLASH@
    "population.dat" using 1:3 title "Children"

ここでは2つ新しい機能を使っている。まず title "..."というのが、凡例のラベルを決めている。ラベルをつけたせいでplotコマンドが長くなったが、バックスラッシュ "\"(日本語キーボードでは円記号、"\")を行末につけて改行すると、2行以上に渡ってコマンドを書くことができる。

[Population #6]
凡例のラベルを変えた例(人口の推移)


* コマンドファイルを使う[Hard!]

さて今回の演習では、構成のよく似たグラフを複数作成することになるはずである。その場合、GNUPLOTを起動するたびごとにタイトルやラベルの指定をいちいちやり直すのは、面倒だし、間違いやすい。そこで、GNUPLOTに与えるコマンドをいったんファイルに書き込んでおき、再利用しよう。

上の人口の推移の例であれば、次のようなファイルを用意しておく。

set title "Variation of Population in Japan"
set xlabel "Year"
set ylabel "Population (x 10,000)"
set grid
plot "population.dat" title "Total", @BACKSLASH@
     "population.dat" using 1:3 t "Children"

見て分かるとおり、GNUPLOTのコマンドを、ただ並べて書いただけである。以下ではこのコマンドを入れたファイル名を "population.gp" とする。もちろん、ファイル名は任意である。

このデータファイルを利用するには、GNUPLOTのプロンプトに、以下のように指示する。

gnuplot> load "population.gp"

あるいはシェルのコマンドライン(GNUPLOTを起動していない状態)から、

% gnuplot population.gp

のようにして、GNUPLOTの引数に与えてもよい。ただしこの場合は、コマンド行をすべて実行し終わった時点で、GNUPLOTが終了する。


* データファイルで気をつけること[Hard!]

数値計算の結果など、プログラムの出力をグラフにするときは、数値は以下のような指数形式で書かれていることがある。

27  0.5781786E+00  0.5778067E+00  0.9534591E+00
28  0.6090178E+00  0.6086833E+00  0.9470444E+00
29  0.6394267E+00  0.6391276E+00  0.9404997E+00

指数形式は、たとえば 3.5E+02 だったら3.5×102という意味である。この形式のファイルは、GNUPLOTにそのまま読ませることができる。

しかしたとえばSun FORTRANの古いバージョンでコンパイルしたプログラムだと、上の例とわずかに異なる出力をする。

27  0.5781786D+00  0.5778067D+00  0.9534591D+00
28  0.6090178D+00  0.6086833D+00  0.9470444D+00
29  0.6394267D+00  0.6391276D+00  0.9404997D+00

指数の表現が"E"ではなく"D"になっている。「倍精度浮動小数点数」の意味なのだが、この書式のファイルをGNUPLOTに食わせると腹を下す。解決策は単純で、エディタなどを用いてDをEに置き換えることである。


<- トップページ
工学院大学機械工学科流体研

リンクはご自由に。でもメールをくれると嬉しいな。

金野 祥久  konno@researchers.jp

Last modified: Fri Feb 18 16:17:07 JST 2000