LTspiceのAC解析結果をgnuplotでボード線図にする

## はじめに
[以前](https://qiita.com/nyamm1018/items/42de5f4fead6ff9b53d4)整形した LTspice の AC 解析結果を用いて、gnuplot でボード線図を作ります。
## 今回作る図
今回用意したのはゲインのデータではないんですが、本記事はあくまで作図の解説なので、ボード線図っぽく縦軸名を設定しました。
![out1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759077/d7bed5e4-5662-538b-f3bc-39dd8531c1a7.png)
## gnuplot スクリプト
データの確認は LTspice 上で終わっているので、いきなり gnuplot スクリプトを書いていきます。
対話形式ってもう何年も使っていないかも。
### 共通設定
```
reset
set terminal pdfcairo enhanced color font "Arial,12" rounded size 8.4cm,6cm
set encoding utf8
```
出力形式は PDF で、SumatraPDF とコマンドプロンプトとテキストエディタを行き来しながらデバッグします。
横幅を 8.4cm にすると、2段組みの A4 論文テンプレートにリサイズせず貼り付けられます。
なお Word に貼り付ける際は emf や svg 形式に変換する必要があります。
```
set style data lines
set style line 1  linetype 1 linewidth 1   linecolor rgb "red"
set style line 91 linetype 1 linewidth 1   linecolor rgb "black"
set style line 92 linetype 1 linewidth 0.5 linecolor rgb "gray20"
set style line 93 linetype 1 linewidth 0.5 linecolor rgb "gray60"
```
データを線で描く設定です。
`plot`コマンドは`using`節が肝心ですから、線種などの雑多な設定はあらかじめ定義しておきましょう。
```
set border ls 91
set ticscale 0.8,0.5
set grid xtics,mxtics ls 92, ls 93
set grid ytics,mytics ls 92, ls 93
```
先ほど定義した黒や灰色系の線種を使って、枠と目盛線のスタイルを指定します。
特に横軸は対数グラフになるので、小目盛線も引きます。
```
unset title
set key bottom left vertical maxrows 2 samplen 0.7 spacing 0.9 \
textcolor variable opaque box linecolor rgb "white"
```
グラフのタイトルはなし。
凡例は左下、複数並べる場合は縦に2段まで積みます（今回は1個だけなので無意味ですが）。
凡例の線は 0.7 と短くし、行間を 0.9 倍に狭めます。
文字色は線と同じになるよう可変させ、背景を白で塗りつぶします。
```
set log x
set xrange [1e6:1e9]
set mxtics 10
set format x ""
```
x 軸を対数目盛にします。
範囲は 1MHz から 1GHz にします。
間に小目盛を引きます。
目盛見出しは不要なので空文字列にします。
```
set output "out.pdf"
```
出力ファイル名を指定します。
### マルチプロット
```
set multiplot layout 2,1 margins 0.14, 0.96, 0.14, 0.96 spacing 0.08 rowsfirst downwards
```
振幅と位相の横軸を揃えるにはマルチプロットを使います。
マージンはキャンバスサイズやフォントサイズに大きく影響されるため、かなりトライアル＆エラーで決めました。
```
set xlabel
set xtics 10
set key
set ylabel "Gain (dB)" offset 0,0
set yrange [-60:40]
set ytics 20
plot "AC1d.txt" u 1:2 t "V_{C1}" ls 1
```
まずはマルチプロット上段のグラフを描きます。
横軸のラベルは上段では不要なので空白を指定しています。
目盛は必要なので`xtics`を設定します。
縦軸範囲も適宜設定します。
最後にデータを赤線で描画します。データファイルは`AC1d.txt`にしておきました。
線種は定義済みなのでスッキリしています。
```
set xlabel "Frequency (Hz)" offset 0,0.5
set xtics add ("1M" 1e6, "10M" 1e7, "100M" 1e8, "1G" 1e9)
unset key
set ylabel "Phase (°)" offset 0.5,0
set yrange [-720:360]
set ytics 360
plot "AC1d.txt" u 1:3 t "V_{C1}" ls 1
```
次に下段を描きます。
今度は横軸名が必要です。
`xtics`に（ラベル名 ポジション）を指定すると、その場所の目盛見出しを変えることができます。
今回は分かりやすいように M（メガ）や G（ギガ）を使いました。
これだけだと大事な小目盛と小目盛線がなぜか消えてしまうので、`add`を付けます。
何に対する`add`かというと、上段で設定しておいた`xtics 10`に対してです。
凡例は省略します。
```
unset multiplot
unset output
```
マルチプロットとファイル出力を終了します。
## 完成したスクリプト
全部まとめると以下になります。
```wave1.plt
reset
# ターミナルと文字コードの設定
set terminal pdfcairo enhanced color font "Arial,12" rounded size 8.4cm,6cm
set encoding utf8

# データ描画方法
set style data lines

# 線種の定義
set style line 1  linetype 1 linewidth 1   linecolor rgb "red"
set style line 91 linetype 1 linewidth 1   linecolor rgb "black"
set style line 92 linetype 1 linewidth 0.5 linecolor rgb "gray20"
set style line 93 linetype 1 linewidth 0.5 linecolor rgb "gray60"

# 目盛りや枠の設定
set border ls 91
set ticscale 0.8,0.5
set grid xtics,mxtics ls 92, ls 93
set grid ytics,mytics ls 92, ls 93

# タイトルと凡例の書式
unset title
set key bottom left vertical maxrows 2 samplen 0.7 spacing 0.9 \
textcolor variable opaque box linecolor rgb "white"

# X軸の設定
set log x
set xrange [1e6:1e9]
set mxtics 10
set format x ""

# 出力ファイル
set output "out.pdf"

# ～～～ここからマルチプロット～～～
set multiplot layout 2,1 margins 0.14, 0.96, 0.14, 0.96 spacing 0.08 rowsfirst downwards

# 上段：X軸ラベルなし、凡例あり
set xlabel
set xtics 10
set key
set ylabel "Gain (dB)" offset 0,0
set yrange [-60:40]
set ytics 20
plot "AC1d.txt" u 1:2 t "V_{C1}" ls 1

# 下段：X軸ラベルあり、凡例なし
set xlabel "Frequency (Hz)" offset 0,0.5
set xtics add ("1M" 1e6, "10M" 1e7, "100M" 1e8, "1G" 1e9)
unset key
set ylabel "Phase (°)" offset 0.5,0
set yrange [-720:360]
set ytics 360
plot "AC1d.txt" u 1:3 t "V_{C1}" ls 1

unset multiplot
# ～～～ここまでマルチプロット～～～
unset output
```
## マルチプロットの注意事項
上段と下段で設定が異なる項目は、面倒でもマメに記載することをお勧めします。
そうしないと、あとで複数のマルチプロットを列挙したくなって、コピペしたり`for`ループを組んだときに、一つ前の設定が残っていて予期しないグラフになります。
## スクリプトの可読性
とはいえ、マルチプロットはどうしてもスクリプトの可読性を下げます。
よって、上下段で共通の設定はなるべく`set multiplot`の外に書いておきたいところです。
今回の例で注意すべきは下段で設定した`xtics`の（ラベル名 ポジション）で、これは`format x`の影響を受けません。
よって`format x`は最初に空文字列を設定したまま、途中でいじる必要がありません。
## その他
「°」を縦軸にカッコで挟むのが気持ち悪い場合、
```
set format y "%.0f°"
```
とすれば縦軸目盛見出しの数字すべてに「°」を付加できます。
マージンの設定はやりなおしですが。
## まとめ
gnuplot を用いて綺麗なボード線図を描きました。
本記事では以下のソフトウェアを使用しました。
有用なソフトの開発者に感謝します。
* `gnuplot 5.4 patchlevel 8`
* `SumatraPDF 3.5.2`
## 参考サイト
[gnuplot のページ (Takeno Lab)](http://takeno.iee.niit.ac.jp/~foo/gp-jman/)
[論文に使えるグラフを作る(応用編その2:複数の物理量を縦に並べてプロットする [Part 2])](https://sk.kuee.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/paper_adv2.html)