gnuplot 入門

gnuplot 入門

2013年5月 岡山大学工学部情報系学科


内容の要約をscriptにまとめました. test.plt
使用data data.dat
出力例 test.eps
これはshell 上で

$gnuplot test.plt

と入力すれば使用できます.

gnuplot 入門 --- 基本の基本編 --- 起動から終了まで

まず,コマンドラインからgnuplotを起動します.


% gnuplot
 
        G N U P L O T
        Version 4.0 patchlevel 0
        last modified Thu Apr 15 14:44:22 CEST 2004
        System: Linux 2.4.23
 
        Copyright (C) 1986 - 1993, 1998, 2004
        Thomas Williams, Colin Kelley and many others
 
        This is gnuplot version 4.0.  Please refer to the documentation
        for command syntax changes.  The old syntax will be accepted
        throughout the 4.0 series, but all save files use the new syntax.
 
        Type `help` to access the on-line reference manual.
        The gnuplot FAQ is available from
                http://www.gnuplot.info/faq/
 
        Send comments and requests for help to
                <gnuplot-info@lists.sourceforge.net>
        Send bugs, suggestions and mods to
                <gnuplot-bugs@lists.sourceforge.net>
 
 
Terminal type set to 'x11'
gnuplot> 

up

プロット実行の為のコマンド

プロットを実行するコマンドは 2 つです.2 次元プロットでは plot ,3次元プロットでは splot を使います. gnuplotが表示するものは,関数かファイルに書かれた数値データです. 関数をプロットするには,plotコマンドに続いて,Xの範囲(3次元なら XとYの範囲)と 関数を与えます. 範囲を省略しても構いません. gnuplot解説書の定番であるy=sin(x)を表示してみましょう. plotコマンドに続けて,sin(x) をコマンドラインから与えます.

gnuplot> plot sin(x)
basic1

これが,gnuplotが表示する2次元グラフです.枠の線は,太い実線で描かれま す.これは,borderと呼ばれます. 凡例は,右上に表示されます. gnuplotでは,凡例をkeyと呼びます. X, Y軸には目盛(tics)が描かれ,目盛のある位置に数値が記入されます. この目盛は,major ticsと呼ばれる大目盛で,各区間は小さな目盛で さらに分割できます. この小目盛は,minor ticsと呼ばれます. 上の図では描かれていませんが,軸に名前を入れることができます. X 軸の名前はxlabelと呼ばれ,X 軸の中央下に表示されます. Y 軸の名前はylabelですが,この表示位置は,gnuplotが図を表示している 端末に依存します. ylabelは,90°回転した状態で Y 軸の左横に来るのが普通ですが, 端末によっては文字の回転が出来ないからです. その場合は,ylabelは Y 軸の上に書かれます.

表示範囲を指定しないとき,gnuplotは適当に X や Y の範囲をスケーリング してくれます. 上の例のように,Xの範囲を何も与えない場合,-10 から +10 の範囲が選ばれ, Y の範囲は,この X 区間で Y 座標がグラフからはみ出さない様に, 自動的に決定されます. X が 0 から 5 の範囲のみをプロットする場合, この範囲を[0:5]の様に指定します.

gnuplot> plot [0:5] sin(x)
basic2
up

プロットでのパラメータを変更するためのコマンド

プロットに関するパラメータは非常にたくさんあり,これらは setコマンドで変更できます.help コマンドで オンラインヘルプを見れば,setで変更できるパラメータの詳細が分かります.

gnuplot> help set
 The `set` command can be used to sets _lots_ of options.  No screen is
 drawn, however, until a `plot`, `splot`, or `replot` command is given.

 The `show` command shows their settings;  `show all` shows all the
 settings.

 If a variable contains time/date data, `show` will display it according to
 the format currently defined by `set timefmt`, even if that was not in effect
 when the variable was initially defined.

Subtopics available for set:
      angles         arrow          autoscale      bar
      bmargin        border         boxwidth       clabel
      clip           cntrparam      contour        data
      dgrid3d        dummy          encoding       format
.....
      zero           zeroaxis       zlabel         zmtics
      zrange         ztics

幾つかの変数を変えてみましょう.まず,xlabelとylabelに文字列を与え て,軸に名前を付けます.文字列は必ず引用符で囲みます.次にXとYの範囲を 与えます.先程の例では,plotコマンドに続いて範囲を指定しましたが, xrangeとyrangeに値を設定しても表示範囲が変わります(注:rangeに範囲を設 定しても plot で別の範囲を指定するとplotの方が優先されます)

gnuplot> set xlabel "X-AXIS"
gnuplot> set ylabel "Y-AXIS"
gnuplot> set xrange [0:5]
gnuplot> set yrange [-2:2]
gnuplot> plot sin(x)
basic3

標準では,gnuplotは画面にグラフを表示します.この出力先を変えて, プリンタで印刷したりPostScriptの図を作ったりするために使うのが, set terminal コマンドです.gnuplotはターミナル毎に,それに合っ たドライバを使って図を描くことで,機種の依存性を無くしています.出力可 能なターミナルは, set terminal コマンドを実行すると分かりま す.

gnuplot> set terminal

Available terminal types:
          unknown  Unknown terminal type - not a plotting device
            table  Dump ASCII table of X Y [Z] values to output
            linux  Linux PC with (s)vgalib
             ....
             tpic  TPIC -- LaTeX picture environment with tpic ¥specials
         pstricks  LaTeX picture environment with PSTricks macros
          texdraw  LaTeX texdraw environment
               mf  Metafont plotting standard

gnuplot> set terminal postscript
Terminal type set to 'postscript'
Options are 'landscape noenhanced monochrome dashed defaultplex "Helvetica" 14'

上の例のように, set terminal postscript とすると,gnuplot はPostScriptの図を生成します.そのままの状態でplotコマンドを実行すると, 出来上がったPostScriptは画面上を流れて行ってしまいます.この出力先を変 更するのが set output です.outputに続けて出力ファイル名を指 定すれば,PostScriptはこのファイルに出力されます.これをPostScriptプリ ンタに送れば印刷されたものが出来上がりです.

gnuplot> set output "plot.ps"
gnuplot> plot sin(x)

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

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

2次元のデータ

数値データは,空白(スペースもしくはタブ)で区切られた カラムにします.行の先頭に#があると,その行は無視されます.

#  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

作ったグラフをTeXの文書に貼り込みたい.

gnuplotのドライバにはlatexというのがあり,これを使えばグラフを PicTeXにして出力してくれます.しかし,この方法は描く図によっては表示す る点の数が非常に多くなる場合があり,TeXの処理がメモリ不足で出来なくな ることがあります.従って,TeXに図を取り込む場合は,図をEPSで出力してお いて,LaTeXのgraphicsパッケージで読み込む方が簡単です.

まず,gnuplotで図をプロットし,出力ドライバをenhanced EPSにして, EPSのファイルを作っておきます.

gnuplot> set term postscript eps enhanced
gnuplot> set output "test.eps"
gnuplot> set key left top
gnuplot> set size 0.5,0.5
gnuplot> set xrange [0:4]
gnuplot> set yrange [0:4]
gnuplot> set xlabel "Energy [MeV]"
gnuplot> set ylabel "Cross Section [b]"
gnuplot> set linestyle 1 lt 1
gnuplot> set linestyle 2 lt 1 pt 7
gnuplot> # for gnuplot ver.4
gnuplot> # set style line 1 lt 1
gnuplot> # set style line 2 lt 1 pt 7
gnuplot> plot 0.2536*x+1.1717      title "LESQ fit" ¥
>                                  with lines      linestyle 1,¥
>             "test.dat" usi 1:2:3 title "data" ¥
>                                  with yerrorbars linestyle 2
fig/sample8.1a

標準のままでEPSを作ると,図に比べて文字が小さくなりすぎてしまいま す. set term のオプションで大きめのフォントを指定するか,この 例の様に set size で全体を小さくしてしまいます.フォントの大き さは変わらないので,相対的に文字が大きくなります.

誤差棒付きの記号を描く場合,gnuplotのPostScriptドライバは,線種を1以 外にすると破線や点線で誤差棒を描いてしまいます.従って,実線で種々 の記号を描くには,linestyleを使い,lt(線種)には1 番(実線)を指定した上でpt(記号)の番号を変えます.


TeX(LaTeX2e)に図を貼り込むには,graphicsパッケージを使います.図を任 意の位置に挿入するには,¥includegraphics{ EPS file }を使います.EPS fileの所にEPSのファイル名を指定し ます.挿入時に,¥resizebox{X size}{Y size}を 使って図全体を拡大縮小することができます.図の縦横の比率を変えずに リサイズするには,X,Y sizeのどちらかに!を指定します.次の例は, figure環境に図を入れてキャプションを付けた場合です.図の横幅を120mm にしています.

¥documentclass{article}
¥usepackage{graphics}
¥begin{document}
  ¥begin{figure}
    ¥begin{center}
      ¥resizebox{120mm}{!}{¥includegraphics{test.eps}}
      ¥caption{This is a sample figure.}
      ¥label{test}
    ¥end{center}
  ¥end{figure}
¥end{document}
fig/sample8.1b

連絡先

名前 部屋 内線 メールアドレス
後藤 佑介 助教 202号室 8098 gotoh あっとまーく cs.okayama-u.ac.jp



GOTOH, Yusuke