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

graph Photo by Luke Chesser on Unsplash

gnuplot とは,対話的にも非対話的にも用いることの出来る,CUI を通じた由緒正しいグラフ作成ツールである(1986に開発開始された). copyright は開発者にあるが,利用,複製,配布は許可されているので無料で使えるぞ.

GUIアプリケーションとしても使えるし,コマンドラインから同様に操作もできるため,機械的に大量にグラフを作成する際などはパイプの間に挟むコマンド風に用いることが可能である.

特徴としては,

  • 普通に使うには,コマンドで指示しながら反応を見るインタラクティブな形.
  • 純粋にコマンドとしても使える.
  • できることは,主に,函数をグラフにすることと,データをグラフにすること.
  • Postscript 形式や SVG 形式, PDF 形式, png 形式など、大変多くの画像形式で出力できる(コンパイルする人が使うライブラリに依る).
  • TeX や web と相性が良い.TeX 用の特殊な設定をすることも可能だが,まあいまの TeX用のグラフは pdf に出力しておけばよいだろう.web 用ならば SVG が画面で綺麗に見えるのでオススメだ.

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

参考資料

名称(リンク) 説明
gnuplot gnuplot 本家 web. 最新版もドキュメントもここにある.
通常利用できる最新バージョンは 5.4 というところか.gnuplot 自身のダウンロードもここから辿れる.
開発版は 5.5 だ.GIT の changlog を読むとかなり頻繁に更新があるようだ.
Windows 用 ver. 5.4.1(windows terminal に支障あり),
Windows 用 ver. 5.4.2α(qt terminal に支障あり)
Windows 用の安定版最新バージョンはここから持ってくると良い.
それぞれ小さな問題があるが,そうだなあ,選ぶとしたら 5.4.2α の方がマシだな(丁寧に設定すると qt terminal の支障を解消できる).
Windows 用バイナリ ver. 5.5 pl 0(ftp 接続)
Windows 用バイナリ ver. 5.5 pl 0(MinGW 版)
Windows 用バイナリ ver. 5.5 pl 0 (cygwin 版)
開発版の Windows バイナリ. 2020年初頭頃のもののはず.少し古いかな.
注: 後者2つのリンク(http接続)は現時点(2021.06)でサーバにアクセスできなくなっている.ftp はまだ残っているようだ.
gnuplot のページ(Takeno Lab) gnuplot のマニュアルの日本語訳や,Windows用gnuplot の日本語化キットまである.
ほぼ最新版まで揃っている.大変ありがたい.感謝して利用しよう.
GNUPLOT - not so Frequently Asked Questions - もしかするとサイト自体は消えているが、
そこはそれ、Way Back Machine を使って過去へ飛んで見てみよう.
gnuplot の入門だけでなく,「こうしたい時には」という
howto が沢山書いてある.ひと通り目を通したい.

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

それぞれの学習環境での状況

環境 状況
阪大情報教育システム
Windows 10
Windows用 gnuplot 5.2rc2 がインストール済み(start > Math にある)
今回はこれを用いても良い.
阪大情報教育システム
cygwin
gnuplot 5.2 pl8 がインストール済み.
グラフ表示の関係でやや使いにくいので,上にある Windows 用を使おう.
阪大情報教育システム
CentOS7
gnuplot 4.6 pl2 がインストール済み.
ちょっと古すぎるかな.上記の Windows 版を使ったほうが良い.
各自PC CentOS7
obtained at OSBoxes
gnuplot は未インストール.
下記(表の下)のようにして 5.2 pl7 をインストールすれば良い.
各自PC Windows 上の表のリンクからダウンロードして 5.4.2α あたりをインストールすれば良い.
各自PC cygwin 未インストールならばインストールしておくと良いのだが,
今のcygwin 用の gnuplot は壊れたものが配布されているのでしばらくインストールを見合わせたほうが良い.
なお,インタラクティブに使うならば windows 版の方が何かと便利だ.
各自PC Mac OS X 通常は未インストールの様子.インストールしよう.
"homebrew gnuplot" などと web 検索して調べて自分でインストールしよう.

(上の表の補足) CentOS 7 に gnuplot をインストールする手順:
普通に yum コマンドでインストールすると古すぎる版(ver. 4.6)がインストールされるので,次のようにしよう.まず,

1
2
3
4
sudo yum update
sudo reboot
sudo yum install pango-devel cairo-devel wxGTK-devel wxBase gd gd-devel
sudo reboot

として環境を準備してから(安全のために環境が更新されるたびにリブートしておく), source forge から "gnuplot-5.2.7.tar.gz" (これより新しい版だと make でエラーになる) をダウンロードし, 適当なフォルダ上にこのファイルを置いて,そこで

1
2
3
4
5
tar -zxvf gnuplot-5.2.7.tar.gz
cd gnuplot-5.2.7
sudo ./configure
sudo make
sudo make install

としてインストールすれば良い.


基礎

なにが出来るのか

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

起動,終了,ヘルプ

1.gnuplot を起動するには,コマンドとして

1
gnuplot

と入力すれば良い.

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

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

1
exit

もしくは

1
quit

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

3.gnuplot のヘルプは,gnuplot中でgnuplot のコマンドとして

1
help

もしくは

1
?

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

ごく簡単な例

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


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

1.まず,gnuplot を起動する.
2.次に,gnuplot の中で次のコマンドを一行ずつ打ち込もう.
ただし # 以降は単なるコメントなので入力しなくて良い.
  4行目は自分の環境に合わせて変えないといけないぞ.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 上で

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

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

1
plot f(x)

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

  gnuplot では,直交座標軸を表す独立変数は 1つ目が $x$, 2つ目が $y$, 3つ目が $z$ となっている. グラフを描画する都合上,3次元で十分だ.

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

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

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

1
replot

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

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

1
plot sin(x) with points

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

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

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

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

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

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

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

1
set samples 200

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

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

1
plot sin(x), cos(x)

のように ,(カンマ) で区切って書くだけで良い.

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

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

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

1
2
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 が負の時にどうなっているかがわかる.

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

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

aa

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

1
i = {0,1}

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

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

aa

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

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

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

1
splot x**2+y**2

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

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

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

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

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

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

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

1
set isosamples 100

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

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

1
set contour

もしくは

1
set contour both

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

1
unset contour

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

4.隠面処理をしたい:

1
set hidden3d

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

1
unset hidden3d

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

5.視点を変えたい:

1
set view 45, 80, 0.8

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

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

1
set pm3d

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

1
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 中で,

1
plot "dummy.dat"

としてみる. たくさんの点が打たれたグラフが描かれるはずだ.

これだと見にくいなあ,という場合は

1
plot "dummy.dat" w l

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

1
plot "dummy.dat" w lp

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

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

グラフをファイルに保存

Windows だと,ある程度新しい gnuplot では、グラフ表示端末機能として wxt や qt が選べて,表示しているグラフをそのまま pdf, svg, png 画像形式で保存できる.

具体的には,

1
set term wxt

とするか、

1
set term qt

としてからグラフを描けば良い. そのグラフをファイルとして保存したければ,グラフを表示しているウィンドウの左上にあるアイコンの中に save / export 機能をもつものがあるので適当に押してみれば良いということになる.

Unix だと wxt term か qt term, x11 term がおそらく使えるので, 前者2つのうち好みのものを使えば良い. MacOS だと qt term か aqua term などだろうから,これまた好みでよいだろう.

aa

Windows 用 gnuplot 5.4.2 で set term wxt 設定でグラフを描いた様子

  Windows には windows term もあって,

1
set term windows

として切り替えると,ファイルへの出力機能は貧弱だが高速な描画や変形ができる. 特に3次元プロットをマウスで掴んで動かす際の速度はこちらが断然速い. 用途に応じて切り替えると良いだろう.

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



使っている gnuplot が古い場合や,スクリプト操作したい場合

残念なことに,あまり古いバージョンの gnuplot にはグラフをボタンひとつでファイルへ保存する機能は存在しないので,用いる gnuplot が古い場合はコマンドを使ってファイルを保存しないといけない.

また,インタラクティブではなく,コマンド投入して動かす,つまり,スクリプトをもとに非インタラクティブに動かしたいという場合で グラフを画像ファイルに保存したい場合は以下の手順が必要だ.

というわけで説明すると,得られた画像をファイルに出力したいというときは,大雑把には

  1. 保存する画像形式を指定する.
  2. 保存するファイル名を指定する.
  3. 画像を描く
  4. (さらになにか作業するなら) 画像形式とファイル名を「リセット」する.
      このリセットをしないと,次に画像を描いたときに同じファイルに異なる画像が「重ね描き」されたりしておかしなことになる.

というちょっと面倒な手順が必要である.

具体的には,以下の手順でグラフを保存しよう.

画像形式の指定とリセット

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

1
set terminal 画像形式 オプション

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

1
unset 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 上で

1
set output ファイル名

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

1
unset output

とすればよい.

結局どうすれば良い?

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

作りたい画像形式 その場合実行するコマンド
(要は下記の5行を順番に実行すれば良いだけ)
png set terminal png color
set output "hoge.png"
plot ほにゃらら
unset terminal
unset output
pdf set terminal pdf
set output "hoge.pdf"
plot ほにゃらら
unset terminal
unset output
Postscript set terminal postscript eps 22
set output "hoge.eps"
plot ほにゃらら
unset terminal
unset output

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

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

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

  実習

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

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

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

1
gnuplot "sin2png.gpl"

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

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

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

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

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/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

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

7.(おまけ) 阪大教育用計算機の windows/cygwin では ffmpeg コマンドが使えるので、これらの連番画像ファイルからある程度新しい動画コーデックを使った動画を作成することが出来る. もちろん各自 PC に ffmpeg をインストールしても良い.

そのような,ffmpeg が使える環境の場合,上の 81個の画像ファイルのあるディレクトリへ移動してから、

1
ffmpeg -r 5 -i "./%02d.png" -vcodec h264 -pix_fmt yuv420p  ./sin.mp4

と実行してみよう. すると、

sin.mp4 という動画ファイル

が作られる. 対応する動画コーデックがある環境(たとえば web browser)ならば、このファイルの動画を見ることが出来るはずだ.

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

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

と実行してみよう. すると、古い mpeg1 規格の動画ファイル sin.mpg (動画がきれいでない上にファイルサイズが大きいが,互換性は高い)を作ることが出来る.

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


レポート

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

課題

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

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

  3. 毎日一度ずつ,シェルスクリプトを通じて gnuplot を呼び出してグラフ画像ファイルを作らせておくとよさそうな例を考え,実際に動かしてみよう(毎日自動で動くようにする,という段階まではできていなくてよい).

  4. Emacs 用の gnuplot packagegnuplot-mode package を用いると Emacs から gnuplot を呼び出したりインタラクティブに操作できたりする1. もしも貴殿が Emacs を使う人ならば,この package のいずれかを試してみよう. ちなみに,いずれも(注意深く設定すれば) Windows の Emacs でもきちんとそこそこ動作することは教員が実際に確認済みである.

  1. より詳しく書くと,gnuplot-mode packagegnuplot package の簡易版的な位置づけで,例えばインタラクティブ操作が出来るのは gnuplot package のみだったりする.しかし,プロセスの取り扱いの関係で,Windows では gnuplot-mode package の方が快適に使える. ちなみに,gnuplot-mode.el の 448行目の "*gnuplot errors*" という20文字を 0 という1文字に書き換えると gnuplot をサブプロセスで呼び出してからすぐ emacs に制御が返ってくるので, とても使いやすくなるぞ(この 0 という指定は特に意味があるので他の文字だとだめだよ). ↩︎