12
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-04-23

本記事は、Haskellで図の描画(gnuplot)-使用例-で紹介したGraphics.Gnuplot.Simple の解説記事です。使用例や、私が使っている設定等はそちらを参考にしてください。
また、細かい設定を行う場合はソースを参考にしましょう。

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 と2つ設定が出ていますが、これらは互いに設定できる内容が異なります。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ではグラフ全体に関する設定を行います。ソースファイルから引用しますと、

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 .." を実行しています。なので

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で作ってあげればよいのですが、画像の出力部分に関しては既存のものを使う必要があったり、リスト内の順序が影響したり、不明な点が多いです。

EPS "test.eps",Custom "terminal" ["eps","enhanced","color"]

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

凡例の線の名前を付けたい

PlotStyleでつけるのでここからいじることはできません。

3 章PlotStyle

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

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

線に名前をつける場合は

defaultStyle {lineSpec = CustomStyle [(LineTitle "linename"),(LineWidth 2.0)]}

とするといいですよ。これに関してはソースに注釈があります。

4 章Atirbute3d

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

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6