GNUPLOT

- not so Frequently Asked Questions -

update 2004/8/31

gnuplot 入門 --- 数値計算編

まずはデータファイルの準備

計算結果をプロットするためには,結果をファイルに落しておく必要が あります.ファイルは通常のテキストファイルにしておきます.次のような プログラムを作り,その結果をプロットしてみましょう.これは,y=exp(-x)の Pade近似を計算するものです.

#include <stdio.h>
#include <math.h>

int main(void);
int main(void)
{
int i;
double x,y,z1,z2,d;

d = 0.1;
x = 0.0;
for(i=0;i<50;i++){
x += d;
y  = exp(-x);
z1 = (6 - 2*x)/(6 + 4*x + x*x);
z2 = (6 - 4*x + x*x)/(6 + 2*x);
printf("% 6.2f % 11.4e % 11.4e % 11.4e\n",
x,y,z1,z2);
}
return 0;
}
INTEGER I
REAL*8  X,Y,Z1,Z2,D
D = 0.1
X = 0.0
DO 10 I=1,50
X = X+D;
Y  = EXP(-X)
Z1 = (6 - 2*X)/(6 + 4*X + X*X)
Z2 = (6 - 4*X + X*X)/(6 + 2*X)
WRITE(6,20) X,Y,Z1,Z2
10 CONTINUE
20 FORMAT(F6.2,3(1X,1PE11.4))
STOP
END

このプログラムの出力の最初と最後の部分は,次のようになります.左端 のカラムがX座標,2番目のカラムがEXP(-X)の値,次の2つのカラムがPade近似 による値を表しています.Xの小さい所で近似は良く,Xが大きくなると精度が 悪くなっているのがわかると思います.

0.10  9.0484E-01  9.0484E-01  9.0484E-01
0.20  8.1873E-01  8.1871E-01  8.1875E-01
0.30  7.4082E-01  7.4074E-01  7.4091E-01
0.40  6.7032E-01  6.7010E-01  6.7059E-01
0.50  6.0653E-01  6.0606E-01  6.0714E-01
....
4.60  1.0052E-02 -7.0237E-02  5.7632E-01
4.70  9.0953E-03 -7.2510E-02  6.0325E-01
4.80  8.2297E-03 -7.4627E-02  6.3077E-01
4.90  7.4466E-03 -7.6597E-02  6.5886E-01
5.00  6.7379E-03 -7.8431E-02  6.8750E-01
up

(X,Y)の組をプロット

このデータをプロットしましょう.計算結果の出力をファイルに書き出し ます.このファイル名をoutput.datとしておきます.プロットするデータは, X座標1つに対して3カラムあります.まずは,2カラム目(EXP(-X)の値)をプロッ トしましょう.

gnuplot> plot "output.dat" using 1:2 with lines
plotcalc1

上の図は,説明をしやすい様にウィンドウを少し小さくしています.

プロットするカラムは using で指定します.using X:Y の様にコロンの 左がX座標のカラム,右がY座標のカラムになります.with の後に,プロット のスタイルを指定します.linesなら,計算点の間を直線で結びます.プロッ トするときの線の種類が幾つかあり,1から順番に番号が与えられています. with linesの後にその番号を与えることもできます.何もしなければ, gnuplotは同時にプロットする線が増えるたびに1番の線から順番に使っていき ます.

プロットのスタイルには,点を打つ,記号を描く,線で結ぶ,階段状の線 で結ぶ,棒グラフを描く,等があります.主なスタイルを以下に挙げます.

with points plotcalc1a
with steps plotcalc1b
with impulses plotcalc1c
up

同時に複数の線を引く

次に,残りの2つのカラムを同時にプロットしてみます.複数の線を同時 に描くにはplotに続けて,描くものを順に指定していきます.gnuplotは,全 部のデータが画面に収まるように軸の値を適当にスケールし,自動的に線種を 変えながらプロットします."output.dat" using X:Y with lines をくりかえ すわけですから,入力行が長くなってしまいます.その場合は,\(¥記号,も しくはバックスラッシュ)を行末にいれると,次の行も継続行とみなされます.

gnuplot> plot "output.dat" using 1:2 with lines, \
> "output.dat" using 1:3 with lines,\
> "output.dat" using 1:4 with lines
plotcalc2

2番目の緑色の線で描かれている数値がXの大きな所で負になるので,Y軸の 最小値は自動的に-0.1まで延びています.

図の凡例には,プロットしたデータファイル名と使ったカラムが表示されて います.ここを変えてみましょう.まず一番上の赤い線は解析関数の値なので, "Analytical"と書きます.次の緑の線はPade近似のL=1,M=2を使ったものなので, "L=1, M=2" という表題を付けましょう.最後の 青い線は,同じくL=2, M=2のPade近似なので,これを表題にしましょう. 凡例の中身を変えるには,プロットするときにtitleを付けます.

gnuplot> plot "output.dat" using 1:2 title "Analytical" with lines, \
> "output.dat" using 1:3 title "L=1, M=2" with lines,\
> "output.dat" using 1:4 title "L=2, M=1" with lines
plotcalc3
up

グラフのタイトルと軸名を入れる

次にXとY軸の名前を入れます.X軸には "x"を書き,Y軸には"y=exp(-x)" をつけましょう.軸の設定には,set xlabelset ylabelを使います.また, set titleを使い,図全体の表題として"Pade approximation"というのをいれ ましょう.replotを使うと,プロットしたものと同じものをもう一度プロット し直しますので,先程の長いコマンドをもう一度入力する必要はありません.

gnuplot> set xlabel "x"
gnuplot> set ylabel "y=exp(-x)"
gnuplot> set title "Pade approximation"
gnuplot> replot
plotcalc4

図の大きさが少し変わったのが分かりますか.gnuplotは全体が枠内(今の 場合ではウィンドウ)に収まる様に,全体を自動的に調整します.軸名や表題 などが入ると,その分図自体は小さくなります.

Y軸名の"y=exp(-x)"は,Y軸の横に入らず上に書かれています.これはXウィ ンドウで図をプロットするときに文字を回転できないためです.文字を横にで きるもの(PostScript等)に出力すれば,Y軸名は正しい位置に表示されます.な お,使っているgnuplotがver.3.8より新しいものなら,画面上でも回転されて いるはずです.

up

XYの範囲を変更する

今度は,X軸とY軸の範囲を変更します.Y軸の範囲は-0.1から1になっています. この負の部分を切り落としてしまい,Yの範囲を[0,1]にしましょう.Xの範囲は [0,5]ですが,これを[0,2]にしましょう.表示範囲を指定するには,set {x|y}range を使います.

gnuplot> set xrange [0:2]
gnuplot> set yrange [0:1]
gnuplot> replot
plotcalc5
up

軸に目盛をいれる

X軸の目盛は0から始まって0.5刻みで増えています.これを1刻みにし,その 間隔に0.2づつ小さな目盛をつけましょう.また,Y軸のほうは,0.5刻みにし, その間を5等分しましょう.

目盛は set {x|y}tics で変えます. set xtics 1 のよう に数字を一つだけ与えると,その数字の間隔で目盛が付き,そこに数字が書かれます. set xtics 0,0.1 の様に2つ与えると最初の数字が初期値, 2番目が増分になります.与えた数字が3つなら,3番目が最終値になります.

小さい目盛は,set m{x|y}tics で,大きい目盛を何分割するかを与えま す.ここでの例なら5分割です.小目盛の所には数字は書かれません.

gnuplot> set xtics 1
gnuplot> set mxtics 5
gnuplot> set ytics 0.5
gnuplot> set mytics 5
gnuplot> replot
up

完成

これで完成です.結果をPostScriptにして,印刷してみましょう. まず,出力ドライバをpostscriptにします.次に結果を出力するファイル名を set output で与え,replotします.このままgnuplotを終ってしまうと, いままでの作業が無くなってしまいます.saveを使って適当なファイル(ここでは output.plt という名前)に保存すると,ここまでの 作業内容がファイルに残ります.

gnuplot> set term postscript
gnuplot> set output "output.ps"
gnuplot> replot
gnuplot> save "output.plt"
gnuplot> quit

出来上がったoutput.psをPostScriptプリンタに送れば,印刷できます. またghostviewやgvを使えば,内容をプレビューできます.下のイメージは, gvでoutput.psを画面に表示したものです.

plotcalc7

縮小しているので見えにくいとは思いますが,ウィンドウでは赤い線だっ たものは実線,緑と青が長さの違う破線に変わっています.この様にgnuplot では,出力ドライバによって,線や記号の種類が変わります.どの番号がどの 種類に対応しているのかは,test としてみると分かります.例えばXウィンドウ では,次のようになります.

gnuplot> set term x11
gnuplot> test
plotcalc8
up