つれづれなる備忘録

日々の発見をあるがままに綴る

gnuplotによるグラフ作成32~データの書き出し、統計情報

 今回はgnuplotを用いてプロットデータをファイルへ書き出す方法とデータファイルの統計情報を読み出す方法について紹介する。

1. データ書き出し

 gnuplotでプロットデータをテキストなどのファイルとして書き出すにはset table "ファイル名"とする。ただし、出力するターミナルがファイルになるので、グラフとして確認することができない。 どのようなプロットかみたい場合は事前にplotコマンドで確認してからset tableを実行するとよい。例えばサインカーブを"sin.txt"というファイルに書き出すには

set table "sin.txt"
plot sin(x)
unset table

生成された"sit.txt"の中身は以下のようになっている。

# Curve 0 of 1, 100 points
# Curve title: "sin(x)"
# x y type
-10  0.544021  i
-9.79798  0.364599  i
-9.59596  0.170347  i
-9.39394 -0.0308337  i
-9.19192 -0.23076  i
-8.9899 -0.421301  i
-8.78788 -0.594705  i
-8.58586 -0.743921  i
-8.38384 -0.862879  i
----以下略

ヘッダー情報として出力点数、plotの関数、2次元xyプロットであることが記載されている。データは1列目がx, 2列目がy (=sin(x))、3列目はレンジに入っているかどうかを示す(i or o)が単純にプロットするとすべてiと表示される。

xyプロットだけでなく3次元プロットのデータもプロットコマンドでsplotとするだけで書き出すことができる。

set table "surf_exp.txt"
splot exp(-x**2-y**2)
unset table

surf_exp.txtの中身は以下のように1列増えてx,y,zの並びになっている。

# Surface 0 of 1 surfaces

# Curve title: "exp(-x**2-y**2)"

# IsoCurve 0, 100 points
# x y z type
-10 -10  1.3839e-87 i
-9.79798 -10  7.55274e-86 i
-9.59596 -10  3.79888e-84 i
-9.39394 -10  1.761e-82 i
-9.19192 -10  7.52337e-81 i
-8.9899 -10  2.96222e-79 i
-8.78788 -10  1.07491e-77 i

複数のプロットを1つのファイルに書き出すためにはsplotwith vectorなどを使うが(以下参照)

gnuplotで数値をファイルに書き出す(table) - 米澤進吾 ホームページ

基本的には、plotまたはsplotで1組づつ書き出した方がコマンドが煩雑にならずに使い勝手がよいと思う。

2. レンジ情報の利用法

 3列目のレンジ内にあるかどうかの情報は、最初にプロットのファイルを作成し、つぎにset yrangeなどとしてレンジを設定してから再度作成したファイルを別のファイルに書き出す等の作業を行う。 例えば、最初にx2のプロットをx2.txtに書き出し、Yのレンジをset range [30:80]として設定する。次にset table "x2range.txt"として最初に作成したデータをplot "x2.txt"とすると、xyのデータがx2.txt"と同じで3列目のi/oの情報だけが異なるx2range.txt`が書き出される。

set table "x2.txt"
plot x**2
unset table

set yrange [30:80]
set table "x2range.txt"
plot "x2.txt"
unset table

x2range.txtは以下のようになっており、3列目はyの値が30以上80以下ではi, それ以外はoと表記されている。

# Curve 0 of 1, 100 points
# Curve title: ""x2.txt""
# x y type
-10  100  o
-9.79798  96.0004  o
-9.59596  92.0824  o
-9.39394  88.2461  o
-9.19192  84.4914  o
-8.9899  80.8183  o
-8.78788  77.2268  i
-8.58586  73.717  i
-8.38384  70.2887  i
-8.18182  66.9421  i
-7.9798  63.6772  i
-7.77778  60.4938  i
-7.57576  57.3921  i
-7.37374  54.372  i
-7.17172  51.4335  i
-6.9697  48.5767  i
-6.76768  45.8014  i
-6.56566  43.1078  i
-6.36364  40.4959  i
-6.16162  37.9655  i
-5.9596  35.5168  i
-5.75758  33.1497  i
-5.55556  30.8642  i
-5.35354  28.6603  o
-5.15152  26.5381  o

レンジ情報を利用するには手順が煩雑で、ファイル数も増えるの使い勝手がよいとはいえない。

3. ファイルの統計情報取得

 データファイルをプロットするとなく、平均値やばらつきなどの統計情報はstatsを用いて取得することができる。例えば、上で作成した"sin.txt"の統計情報を取得するには

stats "sin.txt"

* FILE: 
  Records:           100
  Out of range:        0
  Invalid:             0
  Column headers:      0
  Blank:               1
  Data Blocks:         1

* COLUMNS:
  Mean:               0.0000              0.0000
  Std Dev:            5.8315              0.6897
  Sample StdDev:      5.8609              0.6932
  Skewness:           0.0000              0.0000
  Kurtosis:           1.7998              1.5558
  Avg Dev:            5.0505              0.6155
  Sum:           1.24345e-14              0.0000
  Sum Sq.:         3400.6742             47.5672

  Mean Err.:          0.5832              0.0690
  Std Dev Err.:       0.4124              0.0488
  Skewness Err.:      0.2449              0.2449
  Kurtosis Err.:      0.4899              0.4899

  Minimum:          -10.0000 [  0]       -0.9994 [ 73]
  Maximum:           10.0000 [ 99]        0.9994 [ 26]
  Quartile:          -5.0505             -0.6574
  Median:             0.0000              0.0000
  Quartile:           5.0505              0.6574

  Linear Model:       y = 0.02115 x - 2.039e-17
  Slope:              0.02115 +- 0.01175
  Intercept:          -2.039e-17 +- 0.06855
  Correlation:        r = 0.1789
  Sum xy:             71.94

sin関数ではご利益は少ないが、実験データファイルをプロットするかどうか判断するのに使えそう。

5. まとめ

 今回はプロットデータをファイルへ書き出す方法とデータファイルの中身の統計情報を取得する方法について紹介した。