2015年7月31日金曜日

[gnuplot] グラフのプロット例

二次元グラフのプロット例を以下に示します.
gnuplotのデフォルトの描画範囲は,
-10 <= x <= 10,  -1 <= y <= 1
です.このxとyの範囲を変更してプロットします.
gnuplotを起動して,ターミナルから,以下のようにタイプします.
gnuplot> plot [-2*pi:2*pi] [-1.2:1.2] sin(x)
すると,以下のようなグラフが描かれます.
続いて,以下のようにプロットします.
gnuplot> plot [-2*pi:2*pi] [-1.2:1.2] sin(x), cos(x), tan(x)
すると,3つの三角関数がプロットされ,以下のようなグラフが描かれます.
自分で定義した関数をプロットすることも可能です.
例として,二つの関数(f(x),g(x))を定義し,f(x),g(x),f(x) + g(x)をプロットします.
ターミナルから,以下のようにタイプします.
gnuplot> f(x) = x * sin(x**2) - x
gnuplot> g(x) = x**2 + 1
gnuplot> plot f(x), g(x), f(x) + g(x)
すると,以下のようなグラフが描かれます.

独立変数が2つの関数(z = f(x, y))の場合も同様にプロットできます.
ターミナルから,以下のようにタイプします.
gnuplot> splot x**2 + y**2
すると,以下のようなグラフが描かれ,グリッドで三次元関数を表現できます.
三次元グラフでは,重なりの向こう側は表示しない(隠線処理)ので,そのためのコマンドとして,"setnhidden3d"が用意されています.また,グリッドの数は"set isosamples u方向の線の数, v方向の線の数"で制御します.
例として,ターミナルから,以下のようにタイプします.
gnuplot> set hidden3d
gnuplot> set isosamples 40, 40
gnuplot> splot sin(sqrt(x**2 + y**2))/(sqrt(x**2 + y**2)) 
すると,以下のようなグラフが描かれます.
このグラフでは,"set isosamples 40, 40"というコマンドで,面を (40-1) x (40-1)のメッシュに区切っています.

簡単なデータ処理
以下のような内容のデータファイル(data.txt)を準備します.
0 0.3
1 0.9
2 4.8
3 8.1
4 14.2
データの区切りはTABで記述します.
まずは,ターミナルから
gnuplot> plot "data.txt" using 1:2
と入力すると,以下のようなグラフが描かれます.
このplotコマンドにおいて,最初のオプションは,データのファイル名("data.txt")です.続いて,"using"を用いて,ファイルの第一列がx軸,第二列がy軸であることを指定しています.

このグラフを,データ点を接続する折線グラフにするには,
gnuplot> plot 'data.txt' using 1:2 with lines
と入力します.
すると,以下のようなグラフが描かれます.
また,最小二乗法によって,任意の関数にフィッティングさせることも可能です.
上記のデータを2次関数でフィッティングする例を,以下に示します.
ターミナルから,
gnuplot> f(x)= a*x**2+b*x+c
gnuplot> fit f(x) "data.txt" using 1:2 via a, b, c
と入力すると,以下の計算結果がターミナル上に表示されます.
iter      chisq       delta/lim  lambda   a             b             c            
   0 7.9990000000e+01   0.00e+00  5.09e+00    1.000000e+00   1.000000e+00   1.000000e+00
   1 3.2185677582e+00  -2.39e+06  5.09e-01    6.230554e-01   8.299346e-01   8.806786e-01
   2 7.9861262705e-01  -3.03e+05  5.09e-02    7.411533e-01   5.098035e-01   2.273590e-01
   3 7.8628577192e-01  -1.57e+03  5.09e-03    7.429007e-01   5.283501e-01   1.459378e-01
   4 7.8628571429e-01  -7.33e-03  5.09e-04    7.428571e-01   5.285714e-01   1.457143e-01
iter      chisq       delta/lim  lambda   a             b             c            

After 4 iterations the fit converged.
final sum of squares of residuals : 0.786286
rel. change during last iteration : -7.33037e-08

degrees of freedom    (FIT_NDF)                        : 2
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 0.627011
variance of residuals (reduced chisquare) = WSSR/ndf   : 0.393143

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a               = 0.742857         +/- 0.1676       (22.56%)
b               = 0.528571         +/- 0.699        (132.2%)
c               = 0.145714         +/- 0.5901       (405%)

correlation matrix of the fit parameters:
                a      b      c      
a               1.000 
b              -0.959  1.000 
c               0.568 -0.735  1.000 
さらに,
gnuplot> plot f(x) with lines, "data.txt" using 1:2 with points pointtype 7 pointsize 2
と入力すると,以下のようなグラフが描かれます.
この処理では,
gnuplot> f(x)= a*x**2+b*x+c
において,フィッティング関数  f(x) = ax^2 + bx + c を定義しています.
続いて,
gnuplot> fit f(x) "data.txt" using 1:2 via a, b, c
において,変数 (a, b, c)をフィッティングパラメータとして,最小二乗法の計算を行っています.
出力された,リストの"Final set of parameters"が最も誤差の小さいフッティングパラメーターの値です.
その上で,最後の処理
gnuplot> plot f(x) with lines, "data.txt" using 1:2 with points pointtype 7 pointsize 2
で,データと,フィッティングした2次関数の両方を一度に表示させています.
また,"pointtype","pointsize"を指定しています.

上記の例では,あくまで例ということで,対話形式でのグラフ作成を行っています.
見栄えの良いグラフを作成するには,"set"コマンドを用いて,細かく出力を調整する必要があるので,それを毎回,対話形式で行うのは大変です.
gnuplotには,上記の各コマンドを1つのファイル(コマンドファイル)にして,そのコマンドファイルを実行することで,プロットを描くことができます.
この方法に関しては,別の機会に....

0 件のコメント :

コメントを投稿