「14日で作る量子コンピュータ Visual C++版」で2日目のグラフをgnuplotで描く方法

# 前提
「14日で作る量子コンピュータ Visual C++版」を買って2日目の章まで読み進めたところで、グラフを描く方法が書かれていないことに気が付きました。

本に載っているようなきれいなグラフを描くには、プログラムが出力した数値を自分で何とかしなければなりません。

https://www.cutt.co.jp/book/978-4-87783-470-8.html

本記事は、2日目の章のプログラムを書き終わり、さらにグラフを描きたい人のために書かれています。gnuplotをwindowsにインストールして、スクリプトを用意して、実行する手順を説明します。これにより、定番のgnuplotをつかってグラフをアニメーションで表示できるようになります。

# 動作環境
Windows 10 Homeの64bit版を前提としています。Visual Studio 2019やGNU科学技術計算ライブラリのインストールについては本に丁寧に書かれていますので省略します。

# 所要時間
GNU科学技術計算ライブラリの動作確認を0日目の章で終えている方でしたら、きっと、10分くらいでグラフが描けるのではないかと思います。

# 作業内容

## gnuplotのインストール
次の京大のサイトに書かれている通り、ソースフォージ(SOURCEFORGE)から「[gp542-win64-mingw.exe](https://sourceforge.net/projects/gnuplot/files/gnuplot/5.4.2/)」をダウンロードし、インストールします。インストールしたフォルダは覚えておいてください。デフォルトでは「"C:\Program Files\gnuplot\bin\wgnuplot.exe"」にインストールされると思います。

http://www.compe.media.kyoto-u.ac.jp/syoseki/windows/windows-gnuplot.html

## 2日目の章のプログラムの改変(1行だけ変更)
データからグラフのアニメーションを作る場合、gnuplotではデータの区切りに「改行が2つ」必要です。ですから、p.31のコードの下から4行目を次のように変更します。

```text:planeWave_animation.cpp
            (省略)
            }
            fout << std::endl;
            fout << std::endl;    //この行を追加
        }
        fout.close();
    }
```

本の通りにコーディングすると、出力されるwave.txtのデータは次のような区切りになります。

```text:wave.txt
#x:位置
#y:波動関数の実部
#showLines: true true true
#showMarkers: false false false
#xrange:-2 2 0.2
#yrange:1.2 1.2 0.2
#coma:0
-2 0.39931 -0.681103 -0.0721963
(省略)
2 0.39931 -0.681103 -0.0721963

#coma:1
-2 0.433836 -0.562447 -0.628766
```
元のコードでは「#coma:1」の上に改行が1つしかありません。そこで、上のようにp.31のコードの下から4行目において、改行をもう1つ追加すると出力は次のようになります。

```text:wave.txt
#x:位置
#y:波動関数の実部
#showLines: true true true
#showMarkers: false false false
#xrange:-2 2 0.2
#yrange:1.2 1.2 0.2
#coma:0
-2 0.39931 -0.681103 -0.0721963
(省略)
2 0.39931 -0.681103 -0.0721963


#coma:1
-2 0.433836 -0.562447 -0.628766
```

変更したコードでは「#coma:1」の上に改行が2つ入ることになります。これにより、gnuplotのindexという構文をつかって、波形をアニメーションとして出力できるようになります。

## gnuplotの起動
gnuplotを起動してください。デフォルトでは「"C:\Program Files\gnuplot\bin\wgnuplot.exe"」にインストールされます。起動すると次のような画面が表示されます。
![gnuplot_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128467/651e0d2b-3555-151d-640b-0d8a40f6fa1f.png)
必須ではありませんが、インストールするときに「デスクトップにアイコンを作成」のようなオプションにチェックを入れておくと、デスクトップのgnuplotのアイコンをクリックするだけで「wgnuplot.exe」が起動します。

## gnuplotで動かすスクリプトの準備

「planeWave_animation.cpp」と同じフォルダに次の2つのファイル(plot_graph.gpとplot_loop.plt)を作成してください。

```text:plot_graph.gp
reset					# すべてのgnuplotの設定をクリア

set xrange [-2:2]       # x軸の範囲を設定
set yrange [-1.2:1.2]   # y軸の範囲を設定

first_step = 1			# ループ変数の初期値を設定
last_step = 999			# ループ変数の最大値を設定
step = 1				# ループ変数の増加間隔を設定

load "plot_loop.plt"	# ループ処理を開始します。
```


```text:plot_loop.plt
# ループの初期化
if(exist("n")==0 || n<0) n = first_step 

# 描画
plot 'wave.txt'index n using 1:2 title "k1(0.25[eV])" with lines,\
     'wave.txt'index n using 1:3 title "k2(1.00[eV])" with lines,\
     'wave.txt'index n using 1:4 title "k3(4.00[eV])"with lines

# ループ処理
bind all 's' 'n = last_step'	# [s]ボタンを押したらループを終了
n = n + step            		# ステップの増加
if ( n < last_step ) reread 	# ステップの上限確認

# ループ変数の削除
undefine n
reset
```

## スクリプトの起動
gnuplotのメニューバーから[ファイル]、[開く]を選択して、「plot_graph.gp」を実行します。「plot_graph.gp」が出てこないときは、ファイルの種類を「All Files(\*. \*)」にすると出てくるかもしれません。

なお、実行する前に、キーボードの「s」ボタンでグラフの描画が停まることを覚えておいてください。ウィンドウの「x」ボタンで閉じてもrereadが走ってウィンドウが再び開いてしまいます。

起動に成功すると、次のようなアニメーションが表示されます。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128467/954aafba-023e-93f4-1f80-d35fc63efa96.png)

お疲れさまでした。

# (番外編)スクリプトの改良

gnuplotは定番のソフトウェアで、検索すれば色々な解説を見つけることができます。

## 線の色を変える方法

例えば、線の色を変えたい場合は、Googleで「gnuplot 色を変える」で検索すると、次の解説ページが見つかります。ありがたいですね。(いいねボタンがないのが残念です。)

ゆたりんブログ:gnuplotでプロットなどの色をcolornameの指定で変更する
https://yutarine.blogspot.com/2018/12/gnuplot-colorname.html

そこで、「plot_loop.plt」の描画する部分を改良すると次のようになります。

```text:plot_loop.plt
# ループの初期化
if(exist("n")==0 || n<0) n = first_step 

# 描画
plot 'wave.txt'index n using 1:2 title "k1(0.25[eV])" with lines linecolor "red",\
     'wave.txt'index n using 1:3 title "k2(1.00[eV])" with lines linecolor "blue",\
     'wave.txt'index n using 1:4 title "k3(4.00[eV])"with lines linecolor "green"

```

## グラフにマス目（グリッド）を入れる方法

あるいは、本のようにグリッドを入れたい場合は、Googleで「gnuplot グリッド」で検索すると、次の解説ページが見つかります。

ゆたりんブログ: gnuplot : グラフにグリッド線を描く方法(set grid)
https://yutarine.blogspot.com/2019/06/gnuplot-set-grid.html

またしても、ゆたりんさんのブログが検索順位１位で出てきます。すごいですね。

そこで、今度は「plot_graph.gp」で設定する部分を改良すると次のようになります。

```text:plot_graph.gp
set xrange [-2:2]       # x軸の範囲を設定
set yrange [-1.2:1.2]   # y軸の範囲を設定
set grid				# グリッドを設定（この行を追加)
set mxtics				#（この行も追加)
set grid xtics mxtics	#（この行も追加)
```

線の色を変えて、グリッドを追加すると、次のようになります。

![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128467/ea709263-7d6c-603c-205b-a3a4d13a2d75.png)


gnuplotでは、他にもいろいろな設定が行えますので、興味がある人はぜひ挑戦してみてください。


# 最後に

きれいなグラフが載っている本なので、グラフの描き方についても何かしらの案内があればもっと素敵になるのになあと思います。

「wave.txt」に「#showLines」や「#showMarkers」のようなコマンドが出力されているので、何かのソフトで一発表示できるのではないかと思ったのですが、コマンドで検索してもグラフ描画ツールを見つけることができませんでした。

私が何かの「常識」を分かっていないだけかも知れませんし、本の読み方が足りていないだけのことかもしれませんが、私と同じように戸惑った方がとりあえず前に進むことも大切かなと思います。

それでは、皆様の日々がより楽しいものになりますように！