Haskellで図の描画(gnuplot)-解説編-

本記事は、[Haskellで図の描画(gnuplot)-使用例-](https://qiita.com/tkch_pe/items/1510338cf9fb324b7ab9)で紹介したGraphics.Gnuplot.Simple の解説記事です。使用例や、私が使っている設定等はそちらを参考にしてください。
また、細かい設定を行う場合は[ソース](https://hackage.haskell.org/package/gnuplot-0.5.5.2/docs/src/Graphics.Gnuplot.Simple.html)を参考にしましょう。

# 0章 使い方
　基本的に Graphics.Gnuplot.Simple のみを import します。
また関数は機能を限定するものが複数あります。つまり、例えば軌跡をプロットするplotPathという関数には、複数形の s の有無、plotStyle の指定の有無で

|名前  |機能  |
|---|---|
|plotPath|1つの軌跡を Attribute という設定で描画
|plotPaths|複数の軌跡を Attribute という設定で描画
|plotPathStyle|1つの軌跡を Attribute と PlotStyle という設定で描画
|plotPathsStyle|複数の軌跡を Attribute と PlotStyle という設定で描画

の 4 種類あり、plotPathsStyleはその他の 3 つをすべて含む形となっています。その代わり、plotPath は最も引数が単純であるため、GHCi 上でちょっと見たい時などは有効です。(GHCi 上でplotPath [] z とすればとりあえず z が描画されます。)
　Attribute, PlotStyle と２つ設定が出ていますが、これらは互いに設定できる内容が異なります。Attribute では、軸の設定や凡例の表示、タイトルなどグラフ全体に関わることを設定でき、PlotStyleは先の種類、大きさ、凡例に表示される線のタイトルなど、凡例一つ一つに関わるこを設定できます。なので、他人に見せるためのグラフを作成する場合は一番下の plotPahtsStyle を用いましょう

# 1章 plot関数の種類と使い方

先ほどの通り、同じ機能のものが複数ありますので、ここでは一番細かいものを代表にします。

|名前  |機能
|---|---|
|plotDots      |2 次元に散布図を描画
|plotListsStyle| リストのインデックスをx軸に描画
|plotPathsStyle|複数の軌跡を Attribute と PlotStyle という設定で描画
|plotFuncs     |[数値]と関数を入力することで軌跡を描画
|plotFunc3d    |[x] [y] とf (x,y)を入力することで曲面を描画
|plotParamFuncs|[t]と (x(t),y(t))を入力することで、パラメータ曲線描画
|plotMesh3d    |メッシュデータを引数に曲面を描画


# 2章 Atrribute

Attributeではグラフ全体に関する設定を行います。ソースファイルから引用しますと、

```hs
data Attribute =
     Custom String [String]  -- ^ anything that is allowed after gnuplot's @set@ command
   | EPS    FilePath
   | PNG    FilePath
   | Terminal Terminal.T     -- ^ you cannot use this, call 'terminal' instead
   | Grid   (Maybe [String])
   | Key    (Maybe [String])
   | Border (Maybe [String])
   | XTicks (Maybe [String])
   | YTicks (Maybe [String])
   | Size   (Size)
   | Aspect (Aspect)
   | BoxAspect (Aspect)
   | LineStyle Int [LineAttr]
   | Title  String
   | XLabel String
   | YLabel String
   | ZLabel String
   | XRange (Double, Double)
   | YRange (Double, Double)
   | ZRange (Double, Double)
   | Palette [(Double, (Double, Double, Double))]
   | ColorBox (Maybe [String])
   | XTime
   | XFormat String
```
と、沢山の種類があります。命名が親切で、例えばタイトルを付けたい場合は引数の[Attribute]の箇所に[Title "hoge"]と加え、さらにX軸にラベルを貼るなら[Title "hoge", Xlabel "xhoge"]と配列に加えるだけですみます。しかし、いくつか罠があります!!

### グラフのサイズを大きくしたい
Sizeでは、画像の中でのグラフの大きくなるだけなので、ダメです。Aspectを用いましょう。

### gnuplotで表示したい
GHCi上で :load を行えば可能ですが、コンパイルして実行するとダメです。EPSかPNGに保存しましょう。

### 文字サイズを大きくしたい、フォントを変えたい
XlabelやTitleに「font "Helvetica,20"」とか加えても無駄です。対応するものがないので、Costomを用います。
Costum [A] [B1,B2,..]は gnuplot上で"set A B1 B2 .." を実行しています。なので

```hs
Custom "Title"   ["font","\"Helvetica,24\""]
```
を [Attribute] に加えてあげれば例えば上はタイトルがHelvetica,24になります。
凡例のフォントもここで変更します。

### 画像を保存したい、EPSが白黒になっちゃう
PNGで保存する場合は[PNG "filename.png"]で大丈夫です。
EPSの場合は[EPS "filename.eps"]で一応画像は出力されますが、白黒になってしまいます。
これはgnuplotでepsのカラー保存する際は```set terminal eps enhanced color```とする必要があるのですが、Graphics.Gnuplot.Simpleでは、enhanced color を実行してくれないことにより生じます。よって、これもまた Customで作ってあげればよいのですが、画像の出力部分に関しては既存のものを使う必要があったり、リスト内の順序が影響したり、不明な点が多いです。

```hs
EPS "test.eps",Custom "terminal" ["eps","enhanced","color"]
```
これを[Attribute]に加えることでカラーのEPSを吐き出せます。(EPS "test.eps" の代わりに自分で output を Custom で作った場合、エラーは吐かれませんが画像も吐かれません)

### 凡例の線の名前を付けたい
PlotStyleでつけるのでここからいじることはできません。

# 3 章PlotStyle
グラフの線、点等の各々に付随する設定を行います。これを指定する際は plot する対象 x とタプルをつくって(PlotStyle, x)として使います。

```hs
data PlotType =
     Lines
   | Points
   | LinesPoints
   | Impulses
   | Dots
   | Steps
   | FSteps
   | HiSteps
   | ErrorBars
   | XErrorBars
   | YErrorBars
   | XYErrorBars
   | ErrorLines
   | XErrorLines
   | YErrorLines
   | XYErrorLines
   | Boxes
   | FilledCurves
   | BoxErrorBars
   | BoxXYErrorBars
   | FinanceBars
   | CandleSticks
   | Vectors
```
線に名前をつける場合は

```hs
defaultStyle {lineSpec = CustomStyle [(LineTitle "linename"),(LineWidth 2.0)]}
```
とするといいですよ。これに関しては[ソース](https://hackage.haskell.org/package/gnuplot-0.5.5.2/docs/src/Graphics.Gnuplot.Simple.html)に注釈があります。

# 4 章Atirbute3d

勉強不足です。加筆予定。