GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/5

データファイルの数値のプロット (その1)

1 | 2 | 3 | 4

何かの計算や実験を行い,その結果をグラフにするのが, 理系の研究者にとって最も多いgnuplotの使われ方ではないでしょうか. 結果のデータをプロットして全体を眺め,結果が良さそうだったらポストスクリプト にして印刷したり,EPSにしてTeXで書かれた論文に貼り込んだり....

プロットできるデータのフォーマットは?

2次元のデータ

わざわざ書くまでも無い話しですが,一応ここにまとめておくこと にします.数値データは,空白(スペースもしくはタブ)で区切られた カラムにします.行の先頭に#があると,その行は無視されます. 実はgnuplotは,データがどのように書かれていても,読み込みの書式 を指定することでデータを読めるのですが,ここではこの方法は 取り上げません.

#  X     Y   
   1.0   1.2 
   2.0   1.8 
   3.0   1.6 

例えば2次元データの場合は,上の様にX座標とY座標を並べて書きます.X やYに誤差棒を付けたければ,さらにそれらのカラムを並べて書きます.プロッ トする時にどの数値を使うかを指定するので,カラムの順序はどうなっていて もかまいません.1カラム目をX座標,2カラム目をY座標にしたときは

gnuplot> plot "test.dat" using 1:2

のように,usingを使ってgnuplotに描くカラムを教えます.usingを使わない と,自動的に1カラム目をX,2カラム目をYにしてプロットします.

Y座標に誤差棒を付ける方法は2つあります.1つは Y±Z のようにYを 中心に上下にZの棒を付ける場合.もう一つは Yの範囲[Z1,Z2]が決まっている 場合のように上下の棒の長さが異なる場合です.前者のデータファイル には3カラムの数値,後者なら4カラム必要です.

#  X     Y     Z 
   1.0   1.2   0.2
   2.0   1.8   0.3
   3.0   1.6   0.2
fig/sample7.1a
#  X     Y     Z1    Z2
   1.0   1.2   0.8   1.5
   2.0   1.8   0.3   2.3
   3.0   1.6   1.0   2.1
fig/sample7.1b

それぞれをプロットするときは,

gnuplot> plot "test.dat" using 1:2:3 with yerrorbars
gnuplot> plot "test.dat" using 1:2:3:4 with yerrorbars

の様に using の後の指定が変わるだけです.

表示するデータの形式によって,データカラム数やusingの指定が変わります. 2次元データの場合のこれらを以下にまとめます.

データ表示形式 カラムusing with
(X,Y)のデータ X Y 1:2 lines, points, steps,
linespoints, boxes, etc.
Yに誤差dY X Y dY 1:2:3 yerrorbars
Xに誤差dX X Y dX 1:2:3 xerrorbars
Yに誤差dY,
Xに誤差dX
X Y dX dY 1:2:3:4 xyerrorbars
Yの範囲[Y1,Y2] X Y Y1 Y2 1:2:3:4 yerrorbars
Xの範囲[X1,X2] X Y X1 X2 1:2:3:4 xerrorbars
Yの範囲[Y1,Y2],
Xの範囲[X1,X2]
X Y X1 X2 Y1 Y2 1:2:3:4:5:6 xyerrorbars

3次元のデータ

3次元データは(X,Y,Z)の組にして与えます.デフォルトでは,3次元空間に 点を表示します.with linesのオプションで線を描くようにした場合, データの与え方によって,3次元空間に線だけを描くか,面(つまり縦横の格子) を描くかが変わります.例として,次のように4つのブロックに分かれたデー タを考えます.ブロック間は1行の空行で分けられており,各ブロックのX,Yの 数は異なっています.この場合,gnuplotは格子を描かずに線だけを表示しま す.

# X   Y    Z
  0   0    0
  0   1    1
  0   2    4
  0   3    9
  0   4   16
  0   5   25

  1   0    1
  1   1    2
  1   2    5
  1   3   10
  1   4   17

  2   0    4
  2   1    5
  2   2    8
  2   3   13

  3   0    9
  3   1   10
  3   2   13
gnuplot> splot "test3d.dat" using 1:2:3 with lines
fig/sample7.1c

次に,XYの数をそろえてみます.

# X   Y    Z
  0   0    0
  0   1    1
  0   2    4
  0   3    9
  0   4   16
  0   5   25

  1   0    1
  1   1    2
  1   2    5
  1   3   10
  1   4   17
  1   5   26

  2   0    4
  2   1    5
  2   2    8
  2   3   13
  2   4   20
  2   5   29

  3   0    9
  3   1   10
  3   2   13
  3   3   18
  3   4   25
  3   5   34
fig/sample7.1d

この様に,縦横の格子が入ります.上の例では,各ブロックでのY座標が同 じ場合でしたが,ブロックのY座標が異なっても,各ブロック内の点の数が同 じなら格子が描かれます.これらのデータはグリッドデータとして扱われます. gnuplotが等高線を描いたり,隠線処理をするのは,このグリッドデータに対 してです.試しに上のデータの最後のブロックのY座標だけを2倍すると,次 のようになります.

fig/sample7.1e

各ブロックの点数が同じでも格子を描きたくない場合は,各ブロックの間に 2行の空行を入れます.

# X   Y    Z
  0   0    0
  0   1    1
  0   2    4
  0   3    9
  0   4   16
  0   5   25


  1   0    1
  1   1    2
  1   2    5
  1   3   10
  1   4   17
  1   5   26


  2   0    4
  2   1    5
  2   2    8
  2   3   13
  2   4   20
  2   5   29


  3   0    9
  3   1   10
  3   2   13
  3   3   18
  3   4   25
  3   5   34
fig/sample7.1f

matrix

別の3次元データの与え方として,行列(matrix)で与える方法があります. 上の例の様に,XYの格子が固定さている場合には,こちらの方がデータが簡潔 になります.行列の行(横)はX,列(縦)がY軸になります.

    0    1    4    9
    1    2    5   10
    4    5    8   13
    9   10   13   18
   16   17   20   25
   25   26   29   34

このデータをプロットするときは, using では無く, matrix を用います.行列でデータを与える場合,XとYの座標には行と列の番号がそのまま 入ります.この例では,Xは0〜3,Yは0〜5となります.XとY座標の数値を与えたい場合は, set {x|y}tics を使って軸の目盛を設定します.以下は,Xの0〜2に対して 100から300の数値を与えた場合です.

gnuplot> set xtics ("100" 0, "200" 1, "300" 2) 
gnuplot> splot "test3d.dat" matrix with lines
fig/sample7.1g
up