理学部の学生がgnuplotの備忘録を書く2

[理学部の学生がgnuplotの備忘録を書く](https://qiita.com/yumetodo/items/9b31c63763c371326636)
にまさかの続編が出ました。

# gnuplotのコンソール使いにくすぎない？

WindowsでもWindows Terminalとかそういう快適なCUI環境が整いつつある今、gnuplotのコンソールはあまりにも使いにくすぎる。

カーソルの動きが怪しいし、日本語の表示も怪しい。キーボードショートカットも気に食わない。

# スクリプトファイルにしよう

そもそもgnuplotでグラフを作るまでのコマンド群は大体がお決まりのもので使い回すのだから、スクリプトファイルにするのに向いている。

## UTF-8で書くには

まずスクリプトファイルのエンコードはUTF-8にしたい。いい加減Shift-JISからはお別れしたいし。

そのためにはスクリプトファイルの冒頭で

```
set encoding utf8
```

としておく。Windows環境では必須となる。

## ターミナルとフォントの選択

UTF-8にしたからには絵文字とかも使えるナウでヤングな環境がほしい。

スクリプトファイルを呼び出す前に

```lua
set terminal windows 0 color solid butt enhanced font "HackGen" 
```

とした。フォントには[HackGen](https://github.com/yuru7/HackGen/releases)を採用した。

適当にプロットしたときに開くプロット画面の`Options`で`Direct2D backend`を選ぶ。GDIなんていうカビの生えた方法は捨て去るべきだし、そもそも原理的に絵文字に対応できない。残念なお知らせとしては、このbackend選択はどうも`wgnuplot.ini`に反映されないらしく、`wgnuplot.exe`起動ごとに設定し直す必要がある。gnuplot 5.4とかそのへんでは治っていることを期待したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/0473f0dc-920b-beeb-72a3-7853da9c85c1.png)

下に`GDI+ backend`を選んだ時の様子を示す。絵文字に対応できていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/965c3a69-c3b6-d8ff-9e06-c64a8426756d.png)

下に`Direct2D backend`を選んだ時の様子を示す。モノクロながら絵文字に対応できている。将来のgnuplotでカラーも対応していることを期待したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/b8df5bd6-8638-7b7f-610a-75dfa13e68a0.png)

ただし古いgnuplot(手元にgnuplot 5.1 patch 0があった)ではそのオプションがない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/727058de-4462-a588-bd59-d64f5d15cb0d.png)


うっかりwxtをバックエンドに使って絵文字を表示させようものなら盛大にバグる。つまりwxtはもはや死んだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/2a0927ea-b397-1d85-6707-a3c05b34cc7d.png)

## 現在Windows環境で動くgnuplotのバイナリを手に入れる方法

新規に入手するかと思ってダウンロードサイトに行くと
http://tmacchant3.starfree.jp/gnuplot/Eng/winbin/
リンク切れで落とせない。これではどうもならない。

msys2で

```bash
$ pacman -S mingw-w64-x86_64-gnuplot
```

するのがよい。ただしmsys2のbash上から`wgnuplot`を呼び出すと端末が中途半端にUTF-8に毒されて、日本語パスへの移動すらままならなくなるので、`/mingw64/bin`のパスをエクスプローラーで開いてダブルクリックで起動するべきである。

また、上下キーで過去のコマンドをたどる機能はどういうわけか動かないので毎回コピペすることで対応する必要がある。

あとwxtを使おうとするとコケる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/d6979907-eee4-f5cd-9ec9-7ffeaa437b53.png)


# というわけでスクリプトファイルを書いてみた

```bash:gnuplot_cmd_list.plt
set encoding utf8
set xlabel "位置 [mm]"
set ylabel "波長 [nm]"
set xrange [0:200]
set yrange [0:1000]
# λ=xd/√(l^2+x^2 )
f(x)=(x/(1000*sqrt(215*215+x*x)))*1000000
g(x)=a*x+b
fit g(x) 'lambda-x_plot.txt' via a, b
plot f(x) lt 1 lc rgb '#000000' title "lambda"
replot g(x) lt 1 dt(10, 5) lc rgb '#000000' title sprintf("%fx+%f", a, b)
replot 'lambda-x_plot.txt' lt 1 lc rgb '#111111' pt 6
```

$$ \lambda = \frac {xd}{\sqrt{l^2 + x^2}} $$

のようなやや複雑な式でも`f(x)=(x/(1000*sqrt(215*215+x*x)))*1000000`のように(単位変換が入っていることに注意、$l=215, d=1.0 \times 10^{-3}$は既知のパラメータ)して扱える。

plotするデータも用意する

```plaintext:lambda-x_plot.txt
104	435.8
121 491.6
140	546.1
152	578
157	589
```

このファイルが有る場所に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/afec8e1a-83aa-4d5f-c85a-a63f0938da81.png)

そしたら

```bash
load 'gnuplot_cmd_list.plt'
```

これでプロットできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/1eb7bddb-7072-4960-0122-a0ed3885513a.png)