gnuplot: グラフを描く基本ツール

graph

Photo by rawpixel on Unsplash

gnuplot とは,対話的にも非対話的にも用いることの出来る,CUI を通じた由緒正しいグラフ作成ツールである(1986頃には既に存在したはず). どちらかというとアプリケーションだが,コマンドラインから指示を出せるため機械的に大量にグラフを作成する際などはパイプの間に挟むコマンド風に用いることが可能である. 特徴としては,

  • 普通に使うには CUI 処理.全てをコマンドで指示するので明快.
  • コマンドとしても使える.
  • できることは,主に,函数をグラフにすることと,データをグラフにすること.
  • Postscript 形式や SVG 形式, PDF 形式, png 形式など、大変多くの画像形式で出力できる.
  • TeX と相性が良い.TeX 用の特殊な設定をすることも可能(普通は Postscript を使ったほうが素直で扱いやすいが,TeX のコードで図を書きたい時などにはとても便利.).

ということなどが挙げられる.

参考資料

名称(リンク) 説明
gnuplot gnuplot 本家 web. 最新版もドキュメントもここにある.
最新バージョンは現時点では開発版 5.3 かな.GIT の changlog を読むと、毎月更新があるようだ.
Windows 用 gnuplot 最新版 MinGW 版
Windows 用 gnuplot 最新版 cygwin 版
最新バージョンの Windows 用バイナリはここから持ってくると良いだろう.
通常は MinGW 版で良いだろう.
画像ファイル化などの際のオプションが豊富で便利だ.
gnuplot のページ(Takeno Lab) gnuplot のマニュアルの日本語訳.
ほぼ最新版まで揃っている.ありがたく読ませてもらおう.
GNUPLOT - not so Frequently Asked Questions - もしかするとサイト自体は消えているが、
そこはそれ、Way Back Machine を使って過去へ飛んで見てみよう.
gnuplot の入門だけでなく,「こうしたい時には」という
howto が沢山書いてある.ひと通り目を通したい.

他にも,web 上には gnuplot について書いたものや,書籍が沢山ある. 自分にあったものを探してみよう. ちなみに,gnuplot に関する日本語書籍は希少なので,見かけたらなるべく買っておくと良いだろう.


基礎

なにが出来るのか

上の本家 web の “demo gallery” へアクセスし,どのようなことが出来るのかざっと見ておこう. 文字を読まずにざっと図を見るだけでも,何が出来るかおおよそ把握できると思う.

起動,終了,ヘルプ

  1. gnuplot を起動するには,本来はコマンドラインで

    gnuplot
    

    と入力すれば良い. Windows 用にインストールされたものはメニューから呼び出せるのでそちらのほうが良いだろう. gnuplot が起動して,コマンド受付モードになる(プロンプトが変わるのでわかるだろう).

  2. gnuplot を終了するには,gnuplot のコマンドとして

    exit
    

    もしくは

    quit
    

    とするか、アプリケーションの形をとっているならば X アイコンをクリックでも良い.

  3. gnuplot のヘルプは,gnuplot を起動してから,CUI ならそのコマンドとして

    help
    

    もしくは

    ?
    

    とする. GUI アプリケーションとして実体を持っているならばヘルプボタンがあるだろうからそれを押しても良いだろう.
    いずれにしてもヘルプは多層構造になっていてちょっと読みにくいので,上の本家 web からマニュアルをダウンロードして読む方が良い(マニュアルは普通の作りで読みやすい).

ごく簡単な例

以下のようにして,まずは試してみよう.


  実習
以下の手順に従い gnuplot を動かしてみよう.

  1. まず,gnuplot を起動する.今回は Windows 用をメニューから呼び出すのが良いだろう.
  2. 次に,gnuplot の中で次のコマンドを一行ずつ打ち込もう.

    set samples 300 # 図の細かさを指定
    plot [-30:30] sin(x)/x # 描画
    
    cd 'Z:\' # 保存場所を指定
    set term png # 画像形式指定
    set output "sample-01.png"  # ファイル名指定
    
    replot # 再描画 for save
    
    exit
    
  3. 問題がなければ,以下のような、
    aa
    sample-01.png という画像ファイルができているので,エクスプローラーからそのファイルをダブルクリックするなどして、その画像を見ておこう.

函数を描く

上の例からわかるように,plot コマンドを用いて, 与えた函数をグラフに描くことができる. gnuplot に既に組み込まれている初等関数など( help functions で見ることが出来る)だけでなく,自分でも定義した函数を使うこともできる.

例えば,gnuplot 上で

    f(x)=x*x+2*x+1

とすると函数 f(x) として x^2+2x+1 を定義したことになり,この状態で

    plot f(x)

とすればこの二次多項式のグラフを描くことが出来る.

tips: gnuplot は独立変数は $x,y,…$ がデフォルト.

函数を描く時のオプション

plot に対して,細かくいろいろ変えたいという場合は次のようにすればよい.

  1. 最後に使った plot 命令をもう一度実行したい :

    replot
    

    とすれば, 最後に使った plotsplot(後述) コマンドを再実行する.

  2. グラフの描き方を変えたい :
    gnuplot に関数を描かせると通常は線分で繋がれるが,これを点で表したい時などは次のようにすればよい

    plot sin(x) with points
    

    なお、with points と真面目に書かずに, w p という省略形を使っても良い. with に続けて使えるオプションには points の他に lines, linespoints, impulses, steps, dots, boxes などがある.

  3. 描画する定義域、値域を変えたい : plot コマンドのオプションを直接与えて

    plot [-3:3] [-1.2:2.0] sin(x)
    

    等とするか(一つ目の [a:b] が x軸の範囲を表し,二つ目が y軸の範囲を表す)、plot コマンド実行前に

    set xrange [-3:3]
    set yrange [-1.2:2.0]
    

    などとしてそれぞれを設定してから plot コマンドを使えば良い.

  4. 表示に使う「点」の数を増やしたい :
    グラフを描くための参考になるサンプル点の数が少なすぎてグラフが粗くなって,正しく表示されないというような場合は, plot コマンド実行前に

    set samples 200
    

    などとして、表示に使うサンプル点の個数を直接入力しておけば良い.

  5. 二つ以上の関数を同時に表示したい :

    plot sin(x), cos(x)
    

    などと ,(カンマ) で区切って書くだけで良い.

  6. 場合分けされた関数を定義してグラフを描きたい :
    場合分けできる三項演算子( ? : )というのがあるので、それを用いるといい. 使い方は次の例ですぐわかるだろう.

    f(x) = x>0 ? sin(x) : x**2
    plot [-2:2] f(x)
    

    ちなみに、三項演算子は重ねられる.次の例を見てみると良い.

    f(x) = x>0 ? sin(x) : (x>-1 ? x**2 : x+2)
    plot [-2:2] f(x)
    

    得られるグラフは以下のようになる.
    aa

  7. 複素数が用いられる関数のグラフを描きたい :
    あまり知られていないが、gnuplot 自身もその中の関数も複素数を扱える. real で実部、imag で虚部を求めることができるので、例えば次のようにすると log(x)x が負の時にどうなっているかがわかる.

    plot real(log(x)), imag(log(x))
    

    得られるグラフは以下のようになる.
    aa

    引数も複素数にしたいなど, 少し複雑な場合は、例えば

    i = {0,1}
    

    として(gnuplot では {0,1} が虚数単位である), i を虚数単位に設定していろいろ作業すると楽になる. こうしておいてから次のコマンドを入れると、複素 log 関数の虚部の原点付近の様子を見ることができる(splot については後述).

    splot imag(log(x+i*y))
    

aa



  実習
上の様々なオプションを試してみよう.

3次元グラフを函数で描く

さらに,splot というコマンドを使うと3次元グラフを描くことが出来る. 例えば gnuplot 中で

    splot x**2+y**2

としてみよう. さらに,出てきたグラフをマウスで掴んで動かしてみよう. 様々な視点から3次元グラフを自由に見ることが出来るはずだ.

3D で函数を描く時のオプション

splot に対して,細かくいろいろ変えたいという場合は次のようにすればよい.

  1. 描画する範囲を変えたい : plot コマンド同様に、

    splot [-3:3] [-1.2:2.0] [-2:3] x**2+y**2
    

    等とするか、set xrange などを使えば良い.

  2. 表示に使う「点」の数を増やしたい.
    サンプル点の数が少なすぎてグラフが粗くなって,正しく表示されないというような場合は, splot の前に

    set isosamples 100
    

    などとすれば良い. あまり大きな点数を指定すると処理が重くなるので気をつけよう.

  3. 等高線を表示したい.
    splot の前に

    set contour
    

    もしくは

    set contour both
    

    と入力しておけばよい. both をつけないと底面にのみ等高線図が描かれ, both をつけると面表示にも等高線が描かれる. なお、

    unset contour
    

    とすれば,これ以降は等高線は描かれない.

  4. 隠面処理をしたい :

    set hidden3d
    

    としてから splot すると隠面処理が行なわれる.

    unset hidden3d
    

    とすれば隠面処理は無効になる.

  5. 視点を変えたい :

    set view 45, 80, 0.8
    

    などとしてから splot すると,指定した視点と縮尺で3次元グラフが描かれる. 最初の 45 は z軸(高さ軸)と視線の角度を, 次の 80 は上から見たときの x軸と視線の角度を, 最後の 0.8 はグラフの高さのスケール比を表す.

  6. 高さに色を付けて見たい :

    set pm3d
    

    としてから splot すると高さに応じた色で面を塗ってくれる. 少し処理は重くなる.

    unset pm3d
    

    とすれば元に戻る.


  実習
上の様々なオプションも試してみよう.

データをグラフに

もちろん,函数だけでなく,データをグラフにすることも出来る. 次のようにして確かめてみよう.


  実習
次の指示に従って試してみよう.

  1. テキストエディタ等で,次の内容を持つファイルを作成する(さすがに copy and paste した方がいいだろう).
    ファイル名は dummy.dat としておこう.

    0.0  0.000
    0.2  0.199
    0.4  0.389
    0.6  0.565
    0.8  0.717
    1.0  0.841
    1.2  0.932
    1.4  0.985
    1.6  1.000
    1.8  0.974
    2.0  0.909
    2.2  0.808
    2.4  0.675
    2.6  0.516
    2.8  0.335
    3.0  0.141
    3.2  -0.058
    3.4  -0.256
    3.6  -0.443
    3.8  -0.612
    4.0  -0.757
    4.2  -0.872
    4.4  -0.952
    4.6  -0.994
    4.8  -0.996
    5.0  -0.959
    5.2  -0.883
    5.4  -0.773
    5.6  -0.631
    5.8  -0.465
    6.0  -0.279
    6.2  -0.083
    6.4  0.117
    6.6  0.312
    6.8  0.494
    7.0  0.657
    7.2  0.794
    7.4  0.899
    7.6  0.968
    7.8  0.999
    8.0  0.989
    
  2. gnuplot を起動.

  3. gnuplot 中で,

    plot "dummy.dat"
    

    としてみる. たくさんの点が打たれたグラフが描かれるはずだ.
    これだと見にくいなあ,という場合は

    plot "dummy.dat" w l
    

    とすれば,データ点を繋いだ線グラフになるし,さらに

    plot "dummy.dat" w lp
    

    とすればデータに点も打たれて、わかりやすいグラフになる.


  実習
自分で適当なデータファイルを作成し,そのデータを数値グラフ化してみよ.

グラフをファイルに保存

ある程度新しい gnuplot では、

    set term wxt

とするか、

    set term qt

としてから描いたグラフなら、表示しているグラフをそのまま pdf, svg, png 画像形式でエクスポートする機能がある. 具体的には、グラフ表示画面の左上などに印刷/エクスポートボタンがついている. 自分の環境では、gnuplot をなるべく新しい版にすると幸せになれるだろう.
aa
少し古めの gnuplot 5.1cvs で set term wxt してからグラフを描いて、画像エクスポート機能を使おうとする様子

しかし残念なことに,あまり古いバージョンの gnuplot にはグラフをボタンひとつでファイルへ保存する機能は存在しない ので,用いる gnuplot が古い場合はコマンドを使ってファイルを保存しないといけない. 大雑把には、得られた画像をファイルに出力したいというときは,

  1. 保存する画像形式を指定する.
  2. 保存するファイル名を指定する.
  3. もう一度画像を描く
  4. 画像形式とファイル名を「リセット」する. リセットしないと,次に画像を描いたときに動作がわからなくなる.

というちょっと面倒な手順が必要である. 使っている gnuplot が古い場合は、以下の手順でグラフを保存しよう.

コマンドで画像形式の指定とリセットを行う方法

まず,保存する画像の形式を指定する必要がある. その為には,gnuplot 上で

    set terminal 画像形式 オプション

として指定する. この際、使える画像形式とオプションは非常に多いので,ヘルプとマニュアルを確認しておこう. いくつかの画像形式について、これらの情報を簡単にリストアップしておこう.

■ 画像形式の指定とリセットの例 ■
画像形式 これを指定するコマンド組み合わせの例
png set terminal png
pdf set terminal pdf
Postscript set terminal postscript eps 22
(リセット) unset terminal

なお、かなり古い gnuplot は pdf を知らなかったりするので注意しよう. ちなみに、他に知っておくと便利そうなファイル形式には

  • svg (ベクトル形式)
  • canvas (html5 用)
  • dumb (文字端末画面)
  • epslatex (eps だが、文字は tex で)
  • latex
  • tikz (tex 用の最新画像ライブラリとでもいうか…)

などがある.

出力ファイル名の指定とリセットの方法

保存・出力する画像のファイル名も指定する必要がある. その為には,gnuplot 上で

    set output ファイル名

として指定する. ファイル名のリセットには,

    unset output

とすればよい.

結局どうすれば良いのか

よく分からん… という者も多いだろうから,unix での例をあげておこう. 今描かれている図をファイルに保存したい,という時はとにかく次のようにすればよい.

作りたい画像形式 その場合実行するコマンド(順番に実行する)
png set terminal png color
set output 'hoge.png
replot
unset terminal
unset output
pdf set terminal pdf
set output 'hoge.pdf
replot
unset terminal
unset output
Postscript set terminal postscript eps 22
set output 'hoge.eps
replot
unset terminal
unset output


  実習
適当なグラフを作り,様々な形式で保存しよう.

非対話的に使う(動画を作ってみよう)

gnuplot を非対話的に使う(コマンドとして使う)のは簡単だ. 対話的に入力するのと同じ内容をファイルに書いておいてそのファイル名をコマンドのオプションとして与えればよい. もし与えるコマンドなどが短いならばオプションで直接与えても良い.

わかりやすく実習を通じて試してみよう.

  実習

  1. まず、ファイルに命令を書いておいてそのファイルを指定する方法を試してみよう. sin2png.gpl という名前のファイルを作り,以下の内容を書き込む.

    set term png
    set output "f_sin.png"
    plot sin(x)**2
    


  2. このファイルがあるディレクトリにて,

    gnuplot "sin2png.gpl"
    

    として gnuplot をコマンドとして使ってみよう. このように指示ファイルを与えると,gnuplot はコマンド的に扱える.

  3. 問題がなければ,f_sin.png という画像ファイルができているので,見てみよう.



こうした機能があるので,シェルスクリプトなどから gnuplot を呼び出して機械的にグラフ画像ファイルを作ることが簡単にできる. そこで、次に、命令を直接オプションとして与える方法も試してみよう.

  1. どのディレクトリからでも良いので、

    gnuplot -e "set term dumb; plot sin(x)"
    

    とコマンドラインから命令してみよう. もし -e オプションを受け付けないぐらい古い gnuplot を使うのであれば、

    echo "set term dumb; plot sin(x)" | gnuplot -
    

    とすれば同様な動作が得られるだろう(最後のハイフンを忘れないようにしよう).

  2. シェルスクリプトを置いておくディレクトリに、適当な名前で以下の内容のシェルスクリプトファイルを作ろう.

    #!/bin/bash
    
    function multiplot(){
      local n=$1
      local k=0
      while [ $k -le $n ]
        do
        if [ $k -lt 10 ]
          then f="0$k.png"
        else
          f="$k.png"
        fi
        echo $f
        gnuplot -e "set term png; plot sin(x+$k/10.0)" > $f
        k=$((k+1))
        done
    }
    
    multiplot 80
    

    そして、このファイルに実行許可を出して実行してみよう(gnuplot が古すぎると -e が使えないので、先にチェックしておこう). すると、00.png, 01.png, … と、綺麗に連番で名前がついた、81個の画像ファイルが出来るはずである. これらの画像ファイルを見ておこう.

  3. (おまけ) 阪大教育用計算機の windows/cygwin では ffmpeg コマンドが使えるので、これらの連番画像ファイルからある程度新しい動画コーデックを使った動画を作成することが出来る. 例えば、cygwin で上の 81個の画像ファイルのあるディレクトリへ移動してから、

    ffmpeg -r 15 -i "./%02d.png" ./sin.mp4
    

    と実行してみよう. すると、 sin.mp4 という動画ファイル が作られる. 対応する動画コーデックがある環境ならば、このファイルをダブルクリックすると動画を見ることが出来るはずだ.

    もしも, 動画コーデックがない等の理由で、このファイルより古い規格の動画を作りたければ、例えば、

    ffmpeg -i "./%02d.png" ./sin.mpg
    

    と実行してみよう. すると、古い mpeg1 規格の動画ファイル sin.mpg (ファイルサイズがより大きくて、動画がより汚い)を作ることが出来る.

このように、短い命令であれば直接与えてしまえばなにかとわかりやすく、自動化には大変便利である.


レポート

以下の課題について能う限り賢明な調査と考察を行い,
AppliedMath7-Report-09
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.

課題

  1. 他に面白い動画ファイルを、gnuplot と ffmpeg の組み合わせで作ってみて、解説せよ.

  2. 前回の内容で gnuplot を用いている. その用い方について解説せよ.

  3. 毎日一度ずつ,シェルスクリプトを通じて gnuplot を呼び出してグラフ画像ファイルを作らせておくとよさそうな例を考えよ.