実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

Linuxマシンへのインストール

公式ページのリンクを辿るか以下のコマンドを打つことで,$HOME/build 等の適当なディレクトリにソースコードをダウンロードする.

$ wget https://sourceforge.net/projects/gnuplot/files/gnuplot/4.6.0/gnuplot-4.6.0.tar.gz

以下のコマンドを打つことで,インストールできる.この場合,インストールの場所は $HOME/local となる.グラフィカルな画面を使わない設定.

$ tar zxvf gnuplot-4.6.0.tar.gz
$ cd gnuplot-4.6.0
$ ./configure --prefix=$HOME/local --with-x=no
$ make
$ make install

Windowsマシンへのインストール

Windows 版はユーザーインターフェース的に,Linux 版よりも操作性が良い部分がある.出力形式も windows ではなく,wxt を利用すれば綺麗な画像を表示させることもできる.インストールは以下のように行う.

最初に,公式ページのリンク Primary download site on SourceForge . を進み,最新版の Windwos 版の gnuplot のインストーラーをダウンロードする.バージョンによっては Windows 版が用意されていない場合もある.インストーラーを起動し,次へを何回か押す.ターミナル選択の画面になったら,wxt を選択し,実行ファイルのディレクトリをPATH環境変数に追加するにチェックを入れる.

ida_gnuplot_basic_usage_01.jpg

その後は,そのまま OK または次へを押すだけでインストールが完了する.

Gnuplotの読み方

Gnuplot の読み方はニュープロットとなる.それは開発者らによるFAQのページの 1.2 How did it come about and why is it called gnuplot? に記されている.

Any reference to GNUplot is incorrect. The real name of the program is "gnuplot". You see people use "Gnuplot" quite a bit because many of us have an aversion to starting a sentence with a lower case letter, even in the case of proper nouns and titles. gnuplot is not related to the GNU project or the FSF in any but the most peripheral sense. Our software was designed completely independently and the name "gnuplot" was actually a compromise. I wanted to call it "llamaplot" and Colin wanted to call it "nplot." We agreed that "newplot" was acceptable but, we then discovered that there was an absolutely ghastly pascal program of that name that the Computer Science Dept. occasionally used. I decided that "gnuplot" would make a nice pun and after a fashion Colin agreed.

すなわち,開発者らは現在の gnuplot を newplot という名前で世に出したがったが,他の研究グループが gnuplot とは関係ない他のソフトウェアを newplot と呼んでいることを知ったので,名前を変える必要が生じ,その際に,良い語呂合わせとして gnuplot という名前を思いついたらしい.

出力形式の変更

出力形式は以下のように変更する.svg で出力したいときは以下のようにする.png の場合は以下の svg を png に変える.対話的に描画したいときは svg の部分を windows または wxt に変更する.

$ set terminal svg

スクリプトファイルの読み込み

Gnuplot では対話的な描画以外にも,あらかじめ用意したスクリプトファイルを読み込むことでもグラフを描くことができる.スクリプトファイルを使うと繰り返し処理等の複雑な操作が容易になる.また,大量のコマンドが必要な描画方法についての記録にもなる.以下のようなファイルを作成し,sample.gs と名前を付け保存する.

$ set terminal svg size 600,480 font "Arial,10"
unset key
set xlabel "X"
set ylabel "Y"
set grid lw 0.5 lc rgb "blue"
plot x lc rgb "black"

このファイルは Gnuplot コンソールにてコマンド load を以下のように打つことで読み込む.

$ load("./sample.gs")

または,ターミナルから普通のプログラムを実行するように Gnuplot に引数として渡す.

$ gnuplot sample.gs

結果は以下のようになる.

ida_gnuplot_basic_usage_02.svg

連番ファイルの読み込み

繰り返し構文を用いて連番ファイル名を有するファイルをひとつのコマンドで一度に読み込むことができる.ファイル名が foo.1.dat,foo.2.dat, ..., foo.100.dat のように連番で付けられているファイルを一気に読み込んで描画するには以下のようにコマンドを打つ.

$ plot for [i=1:100] "foo.".i.".dat"

ここで,plot for は繰り返しのコマンドであり,[i=1:100] で繰り返し番号を指定する.

フォントの変更

フォントの変更は以下のコマンドで行なう.

$ set terminal svg font "Arial"

フォントを変更してかつフォントサイズを20にするには以下のようにする.

$ set terminal svg font "Arial,20"

軸ラベルの設定

軸ラベルの設定は以下のコマンドで行う.上からそれぞれ,X軸に PC1,Y軸に PC2,Z軸に PC3 とラベルを付けるコマンドを設定する.

$ set xlabel "PC1"
$ set ylabel "PC2"
$ set zlabel "PC3"

以下のようにするとフォントとフォントサイズも一気に指定でき,便利である.

$ set xlabel "PC1" font "Arial,12"

軸ラベルの位置の微調整は以下のコマンド offset で行う.

$ set xlabel "PC1" offset -2,3

目盛間隔の調整

描いたグラフの目盛間隔の調節は以下のコマンドで行う.上からそれぞれ,X軸の目盛を4,Y軸の目盛を8,Z軸の目盛を5に調整する.

$ set xtics 4
$ set ytics 8
$ set ztics 5

目盛を非表示にするには以下のコマンドを実行する.

$ unset xtics

三次元空間図のZ軸位置の修正

以下のように Gnuplot で三次元空間図を作成すると,明らかにZ軸の位置がおかしい.XY平面から離れている.

$ splot x**2 + y**2
ida_gnuplot_basic_usage_03.svg

このXY平面からずれたZ軸をXY平面に一致させるには以下の set ticslevel 0 を設定する.

$ set ticslevel 0
$ replot

もう一度プロットすると以下のように修正された様子がわかる.

ida_gnuplot_basic_usage_04.svg

元の設定に戻したい場合は以下のコマンドを用いる.

$ unset ticslevel

色彩テーブルの変更

Gnuplot のデフォルトのカラーバーは以下のもの.

ida_gnuplot_basic_usage_05.jpg

カラーバーの目盛間隔を変更するには以下のようにする.目盛間隔を3に変更できる.cbtics に引き続き入力した数字が目盛間隔として設定される.

$ set cbtics 3

以下のように目盛間隔が3に設定される.

ida_gnuplot_basic_usage_06.jpg

小目盛の設定は以下のように行う.mcbtics に引き続き入力した数字の分だけ目盛が分割される.

$ set mcbtics 10

以下のように各目盛が10分割される.

ida_gnuplot_basic_usage_07.jpg

以下のコマンドでカラーバーにおける数字の表示形式を変更できる.f で浮動小数点,e で指数,o で8進数,x で16進数表示に変更できる.% に続けて,(表示桁数を指定する場合はその桁数),(桁数を指定する場合は.),(小数表示桁数を指定する場合はその小数桁数),f または e または o または x を指定する.

$ set format cb "%.2f"

%.2f にて小数第2位を指定したので以下のように小数第2位まで数字が表示される.

ida_gnuplot_basic_usage_08.jpg

以下のコマンドで色彩テーブルの構成色を変更できる.define に続く括弧の中に使用したい色を番号に続けて書き,次の色との間は , でつなぐ.番号が小さいほうがカラーバーにおいても値が小さいほうに対応する.

$ set palette define (0 "navy",1 "blue",2 "dark-violet",3 "red",4 "yellow")

以上のコマンドを実行することで下のように,下からネイビーで上にいくにつれ黄色のカラーバーが設定される.

ida_gnuplot_basic_usage_09.jpg

また,RGBで色を指定することも出来る.以下のようにコマンドを打つとをきれいな虹色のカラーバーを設定することが出来る.

$ set palette rgbformulae 22,13,-31
ida_gnuplot_basic_usage_10.jpg

以下のようなコマンドでもきれいなカラーバーを設定できる.

$ set palette cubehelix start 0.5 cycles -1.5 saturation 1
ida_gnuplot_basic_usage_11.jpg

目盛の非表示は以下のコマンドにて行う.

$ unset cbtics
ida_gnuplot_basic_usage_12.jpg

カラーボックス自体を非表示にするには以下のコマンドを打つ.

$ unset colorbox 

ギリシャ文字の入力

ギリシャ文字を表示させるためには,Gnuplot の出力先の設定をする際にオプション,enhanced を付け加える.以下のようにする.

$ set terminal postscript eps enhanced

以上のコマンドを実行した上で,ギリシャ文字の入力は,{/Symbol 表示させたいギリシャ文字に対応するアルファベット} のように行う.μ を表示させたいときは {/Symbol m} のように入力する.小文字を入力すると小文字のギリシャ文字が,大文字を入力すると大文字のギリシャ文字が表示される.この操作は,/Symbol を文字の前に入力することで,それに続く文字のフォントを Symbol で表示させることに相当する.

$ set xlabel "{/Symbol A B C D E F G H I K L M N O P Q R S T U W X Y Z}"
$ set ylabel "{/Symbol a b c d e f g h i k l m n o p q r s t u w x y z}"
$ plot x

上のようにコマンドを打つと,以下のような結果が得られる.

ida_gnuplot_basic_usage_13.svg

Symbol の前の / はバックスラッシュではなくスラッシュ.ギリシャ文字とそれに対応するアルファベットは以下のようになる.

ギリシャ文字入力表示
alphaa/Aα/Α
betab/Bβ/Β
chic/Cχ/Χ
deltad/Dδ/Δ
epsilone/Eε/Ε
phif/Fφ/Φ
gammag/Gγ/Γ
etah/Hη/Η
iotai/Iι/Ι
kappak/Kκ/Κ
lambdal/Lλ/Λ
mum/Mμ/Μ
nun/Nν/Ν
omicrono/Oο/Ο
pip/Pπ/Π
thetaq/Qθ/Θ
rhor/Rρ/Ρ
sigmas/Sσ/Σ
taut/Tτ/Τ
upsilonu/Uυ/Υ
omegaw/Wω/Ω
xix/Xξ/Ξ
psiy/Yψ/Ψ
zetaz/Zζ/Ζ

三項演算子

Gnuplotでは三項演算子を利用することができる.三項演算子は以下のように記述する.A (という条件) が真ならBが実行され,偽なら C が実行されるというものである.

A ? B : C

以上の演算子を用いれば,指定した範囲では指定した関数を,別の範囲には別の関数をプロットさせることができる.すなわち,指定した範囲によって異なる関数をプロットすることができる.以下のようにコマンドを打つ.

$ plot (x<0) ? -x : 2*x

結果は以下のようになる.

ida_gnuplot_basic_usage_14.svg

以上のコマンドを打つことで,それぞれ,x<0 の範囲では y=-x が,それ以外の範囲では y=2x が描画される.

グラフ上への任意の点のプロット

作成したグラフ上に任意の点を打つには set label コマンドを利用する.最初に以下のコマンドで画像を生成する.

$ set terminal svg size 600,480 font "Arial,10"
$ set ticslevel 0
$ unset key
$ set xlabel "X"
$ set ylabel "Y"
$ set zlabel "Z"
$ splot x**2 + y**2

これを実行した結果は以下のようになる.

ida_gnuplot_basic_usage_15.svg

以上のグラフ上の座標 (0, 0, 80) に点を発生させたいときは以下のようにコマンドを打つ.at にて発生させたい座標を指定する.グラフの中心付近に + で示される点が発生する.

$ set label 1 point at 0,0,80
$ replot

これを実行した結果は以下のようになる.グラフ真ん中に + のマークが見える.

ida_gnuplot_basic_usage_16.svg

次に,点の形,大きさ,色を変えたいときは以下のようにオプションを付け加える.pt はポイントの形を変えるためのオプションで,pt に続けて数字を打つ.ps は点の大きさを変えるためのオプションで,ps に続けて大きさを示す数字を入力する.lc rgb は点の色を変えるオプションで,続けて色の名前を指定する.

$ set label 1 point pt 7 ps 1 lc rgb "dark-violet" at 0,0,80
$ replot

これを実行した結果は以下のようになる.

ida_gnuplot_basic_usage_17.svg

別の点を発生させたいときは以下のようにする.label の直後に入力する数値が発生させる点の ID となる.この数字を変えることで,複数個のポイントをプロットすることができる.以下のコマンドで,座標 (10, 10, 160) に赤で示される点をプロットする.

$ set label 2 point pt 7 ps 1 lc rgb "light-red" at 10,10,160
$ replot

これを実行した結果は以下のようになる.

ida_gnuplot_basic_usage_18.svg

発生させた点を全部消すときは unset label を使う.unset label に引き続き数字を指定すると,上で点を発生させるときに指定した数字に対応する点だけを消すことができる.以下のコマンドを打つと,最初の (0, 0, 80) に発生させた紫の点が消去される.

$ unset label 1
$ replot

これを実行した結果は以下のようになる.

ida_gnuplot_basic_usage_19.svg

目盛間隔の均等化

Gnuplot においてグラフを作成した場合,表示されるグラフの目盛間隔は以下のように普通はX軸,Y軸およびZ軸で均一には表示されない.

ida_gnuplot_basic_usage_20.svg

上のグラフにおいては,X軸における4とY軸における4の間隔がY軸におけるものの方が明らかに大きく不均一である.この不均一な目盛間隔を均等に表示させるには以下のようにコマンドを打つ.

$ set view equal xyz

以上のコマンドを打った後に,もう一度グラフを表示させると以下のように目盛間隔が均等なグラフが描ける.

ida_gnuplot_basic_usage_21.svg

元の比率に戻すには以下のコマンドを打つ.

$ set view noequal

二次元散布図

二次元散布図を描画するには plot を使用する.以下のような,red と blue の2系列データが格納されているファイル data_01.txt を読み込む.# で始まっている行はコメント行であり,グラフには反映されない.ファイル中の数字は一行ごとに2次元空間上における座標を表す.左から (x, y) を表している.2つの数字の間はスペースやタブの空白文字であれば良い.以下のファイル中には,red および blue で示される2つのブロックがあるが,このようにブロックに分けることで,それぞれのブロックごとに色を変えたりドットの形を変えたりできる.ブロックとブロックの間は2行分空ける.

# red
# x	y
12	32
12	38
13	1
18	1
20	16
20	44
23	10
25	39
29	4
31	37
34	30
37	32
38	39
39	11
41	23
41	36
41	36
45	1
47	42
48	12


# blue
# x	y
2	0
3	43
6	37
7	0
11	3
11	39
12	0
16	38
21	21
21	31
27	30
34	44
42	33
43	26
45	4
46	10
47	43

目標のファイル data_01.txt があるディレクトリに移動して以下のコマンドを実行する.

$ set terminal svg size 600,480 font "Arial,10"
$ set xtics 5
$ set ytics 5
$ set xlabel "X"
$ set ylabel "Y"
$ set grid lw 2
$ set key box
$ plot "data_01.txt"

結果は以下のようになる.

ida_gnuplot_basic_usage_22.svg

これではドットが散布図空間のギリギリに位置しており,見にくいので以下のコマンドで表示させる軸の範囲を決め表示させる.X軸は0から50,Y軸も0から50まで表示させる.

$ set terminal svg size 600,480 font "Arial,10"
$ set xtics 5
$ set ytics 5
$ set xlabel "X"
$ set ylabel "Y"
$ set grid lw 2
$ set key box
$ plot [0:50][0:50] "data_01.txt"

結果は以下のようになる.

ida_gnuplot_basic_usage_23.svg

次に以下のコマンドで最初のブロック red の要素を赤,次のブロック blue の要素を青の点で表示させる.各ブロックは上から index 0 および index 1 として認識される.data_01.txt に続けてこのブロック名を指定する.それに続けて,w p にて各座標をポイントで表示させる指定を加える.w p は with points のことである.次に psでポイントの大きさを指定する.次の pt ではポイントの形を指定する.lt ではポイントの色を指定する.使える色はコンソール上で test と打つとサンプルが表示されるので知ることができる.最後の title にてそのブロックに対するラベルを指定する.これを全ブロックについて指定する.

$ set terminal svg size 600,480 font "Arial,10"
$ set xtics 5
$ set ytics 5
$ set xlabel "X"
$ set ylabel "Y"
$ set grid lw 2
$ set key box
$ plot [0:50][0:50] "data_01.txt" index 0 w p ps 0.8 pt 7 lt 1 title "Red","data_01.txt" index 1 w p ps 0.8 pt 7 lt 3 title "Blue"

結果は以下のようになる.

ida_gnuplot_basic_usage_24.svg

Gnuplotは以下のようなデータ構造に対しても二次元グラフを描くことができる.以上では系列 red と blue がブロックごとに分けられていたが,以下のファイル data_02.txt では各行にxの値 (1列目) と,それに対応する green,blue および purple の3系列のYの値 (2, 3, 4列目) が格納されている.このファイルを読み込み,二次元平面上に折れ線グラフを描く.

# x	green	blue	purple
0	19	1	20
1	20	4	21
2	23	10	20
3	33	14	25
4	41	15	26
5	36	23	28
6	18	27	33
7	15	34	34
8	14	44	32
9	16	40	26
10	22	42	22
11	24	38	23
12	18	37	20
13	10	32	22
14	7	30	23
15	4	28	27
16	3	21	33
17	2	20	34
18	2	21	38
19	1	23	42
20	2	19	45

data_02.txt があるディレクトリに移動し以下のコマンドで散布図を描く.ブロックはオプション index にて指定したが,系列ごとにプロットしたいカラムを選択する場合は using オプションを用いる.系列 green をプロットしたい場合は,ファイルの1列目と2列目を用いたいので using 1:2 と入力する.さらに,w lp にて系列間の値をドットで示し,そのドットを線分で結ぶオプションを加える.w lp は with linespoints の略.また,線だけで表現したい場合は w l (with lines) オプションを用いる.その他のオプションについては上の散布図の場合と同様である.

$ set terminal svg size 600,480 font "Arial,10"
$ set xtics 2
$ set ytics 5
$ set xlabel "X"
$ set ylabel "Y"
$ set grid lw 2
$ set key box
$ plot [0:20][0:50] "data_02.txt" using 1:2 w lp ps 0.8 pt 7 lt 2 title "Green","data_02.txt" using 1:3 w lp ps 0.8 pt 7 lt 4 title "Blue","data_02.txt" using 1:4 w lp ps 0.8 pt 7 lt 12 title "Purple"

結果は以下のようになる.

ida_gnuplot_basic_usage_25.svg

三次元散布図

三次元散布図を描くには splot を使用する.以下のようなテキストファイル data_03.txt を読み込む.ファイル中の数字は一行ごとに3次元空間上における座標を表す.左から (x, y, z) を表す.3つの数字の間はスペースやタブの空白文字であれば良い.

# red
0	1	6
3	2	6
7	3	6

		
# blue
9	5	6
7	7	12


# green
15	14	14
18	-3	-2

ファイルが存在するディレクトリに移動して以下のコマンドを打つ.

$ set terminal svg size 600,480 font "Arial,10"
$ set ticslevel 0
$ set xtics 4
$ set ytics 4
$ set ztics 4
$ set xlabel "X"
$ set ylabel "Y"
$ set zlabel "Z"
$ set grid
$ splot "data_03.txt"

結果は以下のようになる.

ida_gnuplot_basic_usage_26.svg

これでは数字が重なっていたり,ドットが散布図空間のギリギリに位置していたりと見にくいので以下のコマンドで表示させる軸の範囲を決め表示させる.X軸は-1から21,Y軸は-5から17,Z軸は-5から16まで表示させる.

$ set terminal svg size 600,480 font "Arial,10"
$ set ticslevel 0
$ set xtics 4
$ set ytics 4
$ set ztics 4
$ set xlabel "X"
$ set ylabel "Y"
$ set zlabel "Z"
$ set grid
$ splot  [-1:21][-5:17][-5:16] "data_03.txt"

結果は以下のようになる.

ida_gnuplot_basic_usage_27.svg

次に以下のコマンドで最初のブロックの要素を赤,次のブロックの要素を青,最後のブロックの要素を緑の点で表示させる.これは二次元散布図の場合と同じ.

$ set terminal svg size 600,480 font "Arial,10"
$ set ticslevel 0
$ set xtics 4
$ set ytics 4
$ set ztics 4
$ set xlabel "X"
$ set ylabel "Y"
$ set zlabel "Z"
$ set grid
$ splot  [-1:21][-5:17][-5:16] "data_03.txt" index 0 w p ps 0.8 pt 7 lt 1 title "Red","data_03.txt" index 1 w p ps 0.8 pt 7 lt 3 title "Blue","data_03.txt" index 2 w p ps 0.8 pt 7 lt 2 title "Green"

結果は以下のようになる.

ida_gnuplot_basic_usage_28.svg

最後に,これらの点をブロック (系列) ごとに線で繋ぐ.これは上のコマンドの w p を,ドットと線分で表示させるオプション w lp (with linespoints) に変えるだけで良い.以下のように打つ.

$ set terminal svg size 600,480 font "Arial,10"
$ set ticslevel 0
$ set xtics 4
$ set ytics 4
$ set ztics 4
$ set xlabel "X"
$ set ylabel "Y"
$ set zlabel "Z"
$ set grid
$ splot  [-1:21][-5:17][-5:16] "data_03.txt" index 0 w lp ps 0.8 pt 7 lt 1 title "Red","data_03.txt" index 1 w lp ps 0.8 pt 7 lt 3 title "Blue","data_03.txt" index 2 w lp ps 0.8 pt 7 lt 2 title "Green"

結果は以下のようになる.

ida_gnuplot_basic_usage_29.svg
Hatena Google+