gnuplot で matplotlib 風の美しい3次元グラフを描くテンプレート

[Gnuplotting](http://www.gnuplotting.org/)が公開しているカラーマップを利用して，matplotlibで描いたような美しい配色の3Dグラフをgnuplotで描けるテンプレートを作成しました．次に示すような2種類を用意してあります．論文などに使えそうです．

![example.png](https://qiita-image-store.s3.amazonaws.com/0/261727/a9943696-f867-1f0c-9a60-af1ea2d96772.png)

# 環境
* OS: Windows 7
* Gnuplot Version 5.2.4

# 準備
初めに，[GnuplottingがGitHub上で公開しているカラーパレット](https://github.com/Gnuplotting/gnuplot-palettes)をダウンロードしておきます．これらのカラーパレットファイル (.pal) をgnuplotファイルがあるディレクトリに置き，gnuplotファイルの冒頭に次の一行を書けば3Dグラフの色が変更されます．

```
load 'palette.pal'
```

"palette"の部分は，使用したいカラーパレットの名称に適宜書き換えてください．定番のカラーパレットは，magma，inferno，plasma，viridisの4つです．これらは，色覚の個人差によらず識別性が高く，モノクロ印刷でも綺麗に仕上がる優れた配色です．

![example2.png](https://qiita-image-store.s3.amazonaws.com/0/261727/0b2e95a5-4c35-0763-c291-c480809cb060.png)

# コード
冒頭で示した2種類のグラフのコードを以下に掲載します．これらのコードをgnuplotファイル (.plt) として保存し，「準備」節で述べた条件のもと実行すれば画像が出力されます．

## 実装例 ① のコード
```plt:sample1.plt
#================================
# drawing settings
#================================
load 'palette.pal' # カラーパレットを読込み

set isosample 32, 32 #メッシュの細かさ x方向, y方向
set hidden3d # 陰面消去

#set grid # 底面にグリッドを表示
set pm3d at b # 底面に正射影

unset key # 凡例を非表示

#================================
# plotting settings
#================================
set xlabel 'x' # x軸のラベル
set ylabel 'y' # y軸のラベル
set zlabel 'f(x, y)' # z軸のラベル

xAxisMax = 4 # x軸の上限
xAxisMin = -4 # x軸の下限
yAxisMax = 4 # y軸の上限
yAxisMin = -4 # y軸の下限
zAxisMax = 10 # z軸の上限
zAxisMin = -8 # z軸の下限

set xrange[xAxisMin : xAxisMax] # x軸の描画範囲を設定
set yrange[yAxisMin : yAxisMax] # y軸の描画範囲を設定
set zrange[zAxisMin : zAxisMax] # z軸の描画範囲を設定

set colorbox user origin 0.90, 0.14 size 0.024, 0.60 #カラーボックスの表示位置を変更
set cbrange[zAxisMin : zAxisMax] # カラーボックスの表示範囲を設定
set cbtic scale 0 # カラーボックスの目盛り線を非表示
#set cblabel "f(x,y)" rotate offset -2, 0 # カラーボックスのラベル
#unset colorbox #カラーボックスを非表示

set view 68, 300, 1, 1 # 前後の回転 (度) ，左右の回転 (度) ，全体の縮尺，z軸の縮尺

#================================
# plotting functions or data
#================================
f(x, y) = 3 * (1-x)**2 * exp(-(x**2) - (y+1)**2) - 10 * (x/5 - x**3 - y**5) * exp(-x**2-y**2) - 1/3 * exp(-(x+1)**2 - y**2) # 描画する関数
splot f(x, y) ls 7 palette # プロット (メッシュ表示)

#================================
# output
#================================
set terminal pngcairo size 600, 600 # アンチエイリアスpng形式 (600*600 px) で出力
#set terminal postscript eps size 4, 4 # eps形式(400*400 px) で出力
set out "out1.png" # ファイル名を指定
replot # 画像を出力
```

## 実装例 ② のコード
```plt:sample2.plt
#================================
# drawing settings
#================================
load 'palette.pal' # カラーパレットを読込み

set ticslevel 0 # z軸の原点をxy平面に合わせる
set isosample 64, 64 #メッシュの細かさ x方向, y方向
set hidden3d # 陰面消去

set grid # 底面にグリッドを表示
set contour # 底面に等高線を表示
set cntrparam levels incremental -8, 1.5, 10 # 等高線の刻み幅

unset key # 凡例を非表示

#================================
# plotting settings
#================================
set xlabel 'x' # x軸ラベル
set ylabel 'y' # y軸ラベル
set zlabel 'f(x, y)' # z軸ラベル

xAxisMax = 4 # x軸の上限
xAxisMin = -4 # x軸の下限
yAxisMax = 4 # y軸の上限
yAxisMin = -4 # y軸の下限
zAxisMax = 10 # z軸の上限
zAxisMin = -8 # z軸の下限

set xrange[xAxisMin : xAxisMax] # x軸の描画範囲を設定
set yrange[yAxisMin : yAxisMax] # y軸の描画範囲を設定
set zrange[zAxisMin : zAxisMax] # z軸の描画範囲を設定

set colorbox user origin 0.90, 0.14 size 0.024, 0.60 #カラーボックスの表示位置を変更
set cbrange[zAxisMin : zAxisMax] # カラーボックスの表示範囲を設定
set cbtic scale 0 # カラーボックスの目盛り線を非表示
#set cblabel "f(x,y)" rotate offset -2, 0 # カラーボックスのラベル
#unset colorbox #カラーボックスを非表示

set view 68, 300, 1, 1 # 前後の回転 (度) ，左右の回転 (度) ，全体の縮尺，z軸の縮尺

#================================
# plotting functions or data
#================================
f(x, y) = 3 * (1-x)**2 * exp(-(x**2) - (y+1)**2) - 10 * (x/5 - x**3 - y**5) * exp(-x**2-y**2) - 1/3 * exp(-(x+1)**2 - y**2) # 描画する関数
splot f(x, y) with pm3d ls 7 palette # プロット (塗りつぶし表示)

#================================
# output
#================================
set out "out2.png" # ファイル名を指定
set terminal pngcairo size 600, 600 # アンチエイリアスpng形式 (600*600 px) で出力
#set terminal postscript eps size 4, 4 # eps形式(400*400 px) で出力
replot # 画像を出力
```

# 参考資料
* [gnuplotのカラーマップ | シキノート](http://slpr.sakura.ne.jp/qp/pm3d-colormap/)
* [Gnuplotting/gnuplot-palettes: Color palettes for gnuplot](https://github.com/Gnuplotting/gnuplot-palettes)
* [matplotlib colormaps](http://bids.github.io/colormap/)