gnuplotとは

gnuplotは、グラフを描画するオープンソースのコマンドラインツールで、png、gif、jpg など多くの形式の画像を生成することができます。1986年に研究者や学生向けに数学の関数を可視化する対話型ツールとして公開されましたが、現在ではWebツールなど多様な用途で使用されています。
OSはMac、Windows、Linuxなど多くのプラットフォームに対応し、導入も容易なため、利用者も多くドキュメントも豊富です(日本語のドキュメントも入手しやすくなっています)。

本家のページ

利用例

数学の関数を2次元、3次元で描画すること得意としているので、学術分野で研究成果を可視化するのによく使用されます。また、棒グラフや折れ線グラフなども簡単に作成することができるため、一般的なデータ可視化用途でもよく利用されています。

gnuplotを使用した例:

prob2.4
surface2.9
multiplt.1
stock_chart

prob2.4、surface2.9、multiplt.1 は本家のデモ画像を元に作成しました

インストール

インストーラーを使う場合

Windows 10

  1. ダウンロードページで最新版をダウンロード
  2. ダウンロードしたファイルをダブルクリックしてインストール開始
  3. 画面の指示に従ってインストールを行う(とりあえず、すべてデフォルトのままでOK)

2017.12.17 時点で最新版(5.2.2)が入りました

Mac

GUIで対話的にイメージの出力を確認したい場合は、AquaTermをインストール(pngなどのファイルに書き出すだけなら不要)

  1. ここから最新版のAquaTerm(.dmg)をダウンロードする
  2. dmgをダブルクリックする
  3. AquaTermInstaller.pkg を開く
  4. 画面の指示通りインストールする
  5. brew install gnuplot --with-aquaterm --with-cairo

AquaTermが必要なければ
brew install gnuplot --with-cairo のみでOK

2017.12.17 時点で最新版(5.2.2)が入りました

CentOS 7.x

# yum update
# yum install gnuplot

2017/12/17 時点のバージョンは 4.6.2

Ubuntu 16.04

# apt-get update
# apt-get install gnuplot

2017/12/17 時点のバージョンは 5.0.3

ソースからインストールする場合(最新版を使いたいとき)

依存/オプションライブラリ

CentOS 7.x

yum update
yum groupinstall "Development Tools"
yum -y install libpng-devel librsvg2-devel libjpeg-devel freetype-devel fontconfig-devel freeglut-devel gdk-pixbuf2-devel libjpeg-turbo-devel pango-devel gts-devel gd-devel cairo-devel

gnuplot本体

  1. ここから最新版をダウンロード
  2. tar zxf gnuplot-5.2.2.tar.gz
  3. cd gnuplot-5.2.2
  4. ./configure
  5. make
  6. make install

gnuplot コマンドを実行してみます。
以下のように表示されれば正しくインストールされています。

# gnuplot

	G N U P L O T
	Version 5.2 patchlevel 2    last modified 2017-11-15

	Copyright (C) 1986-1993, 1998, 2004, 2007-2017
	Thomas Williams, Colin Kelley and many others

	gnuplot home:     http://www.gnuplot.info
	faq, bugs, etc:   type "help FAQ"
	immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'unknown'

gnuplotの言語仕様

Reference

用語

用語 説明
command 式のこと. 値をセットしたり、描画したり
macro command を複数記述して逐次実行できるようにする

gnuplotの開始、終了

対話モード

その都度 command を入力するモードです。quitまたはexitで終了します。
gnuplot >というプロンプトにつづけて command を入力します。

$ gnuplot # ファイル名なしで対話モードに入る
gnuplot > command
gnuplot > quit

非対話モード(バッチモード)

マクロファイルを引数に与えると、そのファイル内に記述されたコマンドが逐次実行されます。また、標準入力からコマンドを取り込んで実行することもできます。
マクロファイルの拡張子は、.plt、.gp、.gpl などが使用されることが多いようです。 以下の例では、マクロが記述された macro_file を実行しています。

$ gnuplot macro_file
## または
$ cat macro_file | gnuplot

出力先デバイスの指定

出力先デバイスとは、plot(下記参照)などの描画コマンドを実行したときに、それをレンダリングして書き出す先のことです。

使用できる出力先(terminal)の一覧を確認します。

gnuplot> set terminal

Available terminal types:
       cairolatex  LaTeX picture environment using graphicx package and Cairo backend
           canvas  HTML Canvas object
              cgm  Computer Graphics Metafile
          context  ConTeXt with MetaFun (for PDF documents)
          domterm  DomTerm terminal emulator with embedded SVG
             dumb  ascii art for anything that prints text
              dxf  dxf-file for AutoCad (default size 120x80)
            eepic  EEPIC -- extended LaTeX picture environment
              emf  Enhanced Metafile format
            emtex  LaTeX picture environment with emTeX specials
         epscairo  eps terminal based on cairo
         epslatex  LaTeX picture environment using graphicx package
              fig  FIG graphics language for XFIG graphics editor
              gif  GIF images using libgd and TrueType fonts
             hpgl  HP7475 and relatives [number of pens] [eject]
             jpeg  JPEG images using libgd and TrueType fonts
            latex  LaTeX picture environment
               mf  Metafont plotting standard
               mp  MetaPost plotting standard
             pcl5  HP Designjet 750C, HP Laserjet III/IV, etc. (many options)
         pdfcairo  pdf terminal based on cairo
              png  PNG images using libgd and TrueType fonts
         pngcairo  png terminal based on cairo
       postscript  PostScript graphics, including EPSF embedded files (*.eps)
          pslatex  LaTeX picture environment with PostScript \specials
            pstex  plain TeX with PostScript \specials
         pstricks  LaTeX picture environment with PSTricks macros
              qms  QMS/QUIC Laser printer (also Talaris 1200 and others)
          sixelgd  sixel using libgd and TrueType fonts
              svg  W3C Scalable Vector Graphics
          tek40xx  Tektronix 4010 and others; most TEK emulators
          tek410x  Tektronix 4106, 4107, 4109 and 420X terminals
          texdraw  LaTeX texdraw environment
             tgif  TGIF X11 [mode] [x,y] [dashed] ["font" [fontsize]]
         tkcanvas  Tk canvas widget
             tpic  TPIC -- LaTeX picture environment with tpic \specials
          unknown  Unknown terminal type - not a plotting device
            vttek  VT-like tek40xx terminal emulator
              x11  X11 Window System interactive terminal
             xlib  X11 Window System (dump of gnuplot_x11 command stream)
            xterm  Xterm Tektronix 4014 Mode
gnuplot> quit

よく使われる png(cairo)、gif、svg が入っていることが確認できました(一例)。

デフォルトでは、出力先デバイスが 'unknown' などとなっていることがあるので、set terminal 'aqua' のように明示的に指定(変更)します。

gnuplot> plot sin(x)
WARNING: Plotting with an 'unknown' terminal.
No output will be generated. Please select a terminal with 'set terminal'.
gnuplot> set terminal 'aqua'

Terminal type is now 'aqua'
Options are '0 title "Figure 0" size 846,594 font "Times-Roman,14" enhanced solid'
gnuplot> plot sin(x)

すると、出力先デバイス(この場合AquaTermのウィンドウ)に次のような画像が出力されます。

sample01

対話モードを使用する場合は、出力先デバイスにGUIデバイスを設定する使い方が一般的です。プラットフォーム別では次の表のように設定することが多いようです(いろいろですが)。

プラットフォーム ターミナル名
Windows wiindows, wxt
Mac aqua
Linux x11 など

一方、非対話モード(バッチモード)では、ファイルに画像を出力する使い方が基本です(非対話モードでGUIデバイスを使用したり、対話モードで出力先をファイルにしたりすることも可能です)。非対話モードでは、プラットフォームに関係なく、png、pngcairo、gif、svg などを出力先デバイス名に設定します(直接、画像ファイルに書き出す場合は、以下の例のように set output 'filename' を指定します)。
もちろん、自身の環境で set terminal の一覧に出てくるものを指定する必要があります。

$ cat png.plt
set terminal 'png'
set output 'out.png'
plot sin(x)
$ gnuplot png.plt

これで、out.png というファイルが生成されます。
なお、 terminalterm と、 outputout と省略形でも記述できます。

ちなみに、pngcairo や pdfcairo の cairo というのは、cairo という2Dベクターベースのライブラリで、アンチエイリアスにより画像を滑らかにしてくれるなどの長所があり多くのシステムで利用されています。逆に、ラスタ画像ではファイルサイズが非常に大きくなるというデメリットがあります。

演算子

command の中で演算子が使用できます。

二項演算子

使用できる二項演算子は次の通りです。

シンボル 説明
** a**b べき乗
* a*b
/ a/b
% a % b 剰余
+ a + b
- a - b
== a == b 等価
!= a != b 不等価
< a < b 未満
<= a <= b 以下
> a > b より大
>= a >= b 以上
<< 0xff<<1 左シフト
>> 0xff>>1 右シフト
& a & b ビット積
^ a ^ b 排他的論理和
| a | b ビット和
&& a && b 論理積
|| a || b 論理和
= a = b 代入
, (a,b) 連続評価
. A.B 文字連結
eq A eq B 等価(文字)
ne A ne B 不等価(文字)

三項演算子

シンボル 説明
?: a ? b : c 三項演算

使用例

f(x) = 0<=x && x<1 ? sin(x) : 1<=x && x<2 ? 1/x : 1/0

制御構造

gnuplotは、バージョン4.6から制御構造(if/else/while/do)を扱えるようになりました。
詳細は次回以降。

plot

plot は、2次元の画像を出力するためのコマンドです。

書式は次の通りです。

plot {ranges} <function> {title}{style} {,<function> {title}{style}...}

{ranges}は、X軸、Y軸の出力範囲を設定します(省略可)。
<function>は、数式、データファイル名、定義済み(またはユーザー定義)関数です。

plot data using …

外部ファイルからデータを読み込んで処理することができます。
次の身長と体重のデータ(data_file)を例にとります。

Height Weight
170 65
168 75
175 72
180 80
173 67

データファイルの形式は、1行目がヘッダー行、2行目以降がデータ行となっています。

この場合の plot の書式は次のようになります。 using 以降はオプションです。

plot 'data_file' using <entry> {:<entry> {:<entry> ...}} {'format'}

各行の<entry>データの参照方法はいくつかあり、以下の各行は同じ結果を返します(’format’の部分は省略可能で、ここでは説明も省略)。’data_file’の部分は使用するファイルのパスに置き換えてください。

plot 'data_file' using 1:2
plot 'data_file' using ($1):($2)
plot 'data_file' using (column("Height")):(column("Weight"))
plot 'data_file' using "Height":"Weight"

X:Y のように各列をコロンで区切り、左からX軸の値、Y軸の値となります。

次の例は、身長と体重のデータからBMI(体重(kg)÷身長(m)の2乗)を計算しています。
ここで”0:“となっているのは、0列目?ではなく、”0”という仮想的な列で「行番号」を表します。

plot 'data_file' using 0:($2 / ($1 / 100)**2)

データ1行目の(X,Y)の値が(1,(65/(1.70*1.70))、2行目が(2,75/(1.68*1.68))、のようになります。

splot

splot は、3次元の画像を出力するためのコマンドです。
書式は次の通りです。

splot {ranges} <function> {title}{style} {,<function> {title}{style}...}

{ranges}は、X軸、Y軸、Z軸の出力範囲を設定します(省略可)。

splot では 列を X:Y:Z と指定します。
基本的な考え方は plot 同じです。

まとめ

gnuplotがはじめてという方向けで、環境のセットアップから基本的な文法を解説しました。今回は導入編ということで、ごくごく基本的な文法だけ取り上げましたが、実際は非常に多くのルールが存在します。最初は取っつきづらいと思いますが、慣れてくれば楽しく?なるので、どんどん手を動かして触ってみることをお勧めします。