高専7年生のメモ

院試対策とか研究とか。あとカメラ買いました?

Gnuplotでプロットしたい

無限のポテンシャルを持つGnuplotですが,いちいち検索してはsetするのが無限に面倒くさいです。

Gnuplotで測定データをプロットするのに苦労点が多々あったので,その解決方法をここにまとめておきます。

目次

参考になったサイト

gnuplotの初歩
あらきだのメモ箱 - gnuplot の pm3d
タイトル未定: Gnuplot
gnuplotのfit関数を使ったフィッティング~その1~ - Qiita
gnuplot / plot3d (1)

Gnuplotをインストールしたい

そのままHomebrewからインストールすると,出力先が行方不明になり怒られるので,以下のようにします。

出力先をX11にしたい

出力先として,グラフをぐりぐり弄ることができるX11も一緒にインストールするときは

$ brew install gnuplot --with-x11

これでX11でインスタントにプロットしたグラフを見たり,視点をぐりぐり弄られます。

出力先をAquaTermにしたい

アンチエイリアスがかかった綺麗なグラフがいい人はAquaTermも一緒にインストールすると幸せになれます。

$ brew install gnuplot --with-aquaterm

Gnuplotで関数をプロットしたい

2次元の関数をプロットしたい

sinc関数を2次元でプロットしてみます。sinc(x)とすると怒られるのでsin(x)/xとします。

gnuplot> plot sin(x)/x

f:id:taichasoooo:20161125182737p:plain:w300

それっぽい出力がされました。

3次元の関数をプロットしたい

3次元でプロットしてみます。sinc関数も3次元のものを使います。

gnuplot> splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2)

f:id:taichasoooo:20161125224232p:plain:w300

一応3次元の曲面(っぽいもの)が出力されましたが,このままでは見づらいです。線をいい感じに増やしていい感じにします。いい感じにならないときはisosamplesの値をいい感じに変えましょう。

gnuplot> set isosamples 50 
gnuplot> splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2)

f:id:taichasoooo:20161125224158p:plain:w300

これでようやくそれっぽい曲面をゲットできました。

z軸原点とxy平面をくっつけたい

普通にsplotするとgnuplotはz軸の最下点がxy平面から離れたグラフを出力します。 これを改善するには次のおまじないをすればokです。

gnuplot> set ticslevel 0

f:id:taichasoooo:20161125224933p:plain:w300

こちらのほうが自然なグラフに見えます。

グラフの軸の設定を変えたい

デフォルトの設定では,とてもナイスとは言えないグラフが出来上がるので色々変えます。

軸にラベルを付けたい

x, y, z軸にラベルを付けるときは以下のようにするとラベリングできます。

gnuplot> set xlabel "x-axis name"
gnuplot> set ylabel "y-axis name"
gnuplot> set zlabel "z-axis name"

f:id:taichasoooo:20161125224415p:plain:w300

しかしz軸のラベルが軸の目盛りを邪魔してしまうようです。

グラフのラベルを回転させたい

z軸のラベルを回転させたいときは以下のようにすると良いようです。

gnuplot> set zlabel rotate by 90

f:id:taichasoooo:20161125224443p:plain:w300

x, y軸のラベルも同様ですが,実質z軸のラベルを90deg回転する以外の用途が無いような気がします。

要らない上と右の軸と目盛りを消したい

f:id:taichasoooo:20161125182737p:plain:w300

二次元のxy座標でグラフを作った時,デフォルトでは上と右にも軸と目盛りが作成されてしまいます。ナイスではないす。 というわけで消してしまいます。 まず右と上の軸を消します。おまじない。

gnuplot> set border 3

f:id:taichasoooo:20161125223540p:plain:w300

しかし,これだけでは軸は消えても目盛りは残っています。目盛りが邪魔なので消します。

gnuplot> set xtics nomirror
gnuplot> set ytics nomirror

はい,完成です。

f:id:taichasoooo:20161125223634p:plain:w300

コンター図(等高線)をつくりたい

コンター図を作るときは,pm3dを使います。

gnuplot> splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2) with pm3d

これでzの値の大きさによって色分けされたコンター図が出力されます。

f:id:taichasoooo:20161125224534p:plain:w300

コンター図の配色を変えたい

グレースケールにしたい場合は

gnuplot> set palette gray 

f:id:taichasoooo:20161125224608p:plain:w300

虹色にしたい場合は

gnuplot> set palette rgbformula 22,13,-31

とします。数値を弄れば色も変わります。

f:id:taichasoooo:20161125224637p:plain:w300

ファイルを読み込んでプロットしたい

ファイルから3次元にプロットする際は,

gnuplot> splot "filename"

とすることでプロットができます。

点面でプロットしたい

データから,点を用いて曲面を描きたいときは次のようにすれば良いです。

gnuplot> splot "filename" with points

f:id:taichasoooo:20161125225627p:plain:w300

pt, lcのオプションの数値を変化させることで,グラフの印象が変わります。 ptは点の種類,lcは点の色です。

gnuplot> splot "filename" with points pt 7 lc 4

f:id:taichasoooo:20161125225701p:plain:w300

好み,グラフの種類によって変えられるとナイスです。

カンマ区切りのファイルでプロットしたい

Gnuplotがファイルを読むとき,デフォルトでは空白を区切りとして読むみたいです。

CSVファイルなどのカンマ区切りのファイルでプロットしたいときは

gnuplot> set datafile separator ","

とおまじないをして,カンマを区切り子としてsetすることで読み込めるようにします。 例えば3次元XYZ座標の点をプロットしたいとき,ファイルは

#filename.csv
#comment
#X,   Y,    Z
 0,   1,    2
 3,   4,    5
 6,   7,    8

のように書いておけば良いです。#をつけるとその行はコメントとして扱われます。

pm3dで謎のエラーが出るのを解決したい

pm3dでプロットしようとすると,

  Warning: Single isoline (scan) is not enough for a pm3d plot.
       Hint: Missing blank lines in the data file? See 'help pm3d' and FAQ.

というエラーが出ることがあります。これは自分の場合,

#data
#X,   Y,    Z
 0,   1,    2
 0,   2,    4
 0,   3,    6
 0,   4,    8
 1,   1,    1
 1,   2,    2
 1,   3,    3
 1,   4,    4

のような,1カラム目に同じ数値が連続して入っているファイルをプロットしようとする時に起こりました。

これは,次のように1カラム目の数値の変わり目に改行を入れることで解決できます。

#data
#X,   Y,    Z
 0,   1,    2
 0,   2,    4
 0,   3,    6
 0,   4,    8

 1,   1,    1
 1,   2,    2
 1,   3,    3
 1,   4,    4