Haskell Chart パッケージでグラフ描画


先日『Lotka-Volterra モデルのシミュレーション』で Haskell を用いて数値シミュレーションを行いましたが,せっかく Haskell でシミュレーションしたにもかかわらず結果のグラフを R で描画するという残念な感じでした。調べてみると Chart というグラフ描画のパッケージを見つけましたのでその紹介[A]

なお,本記事は Haskell Advent Calendar 2011 の 9 つ目の記事にあたります。

Chart パッケージのインストール

Ubuntu の場合, Chart パッケージは libghc-chart-dev パッケージを apt 経由でインストールしても良いのですが, GTK のモジュールがインストールされないためウィンドウにプロットすることができません。ウィンドウへのプロットが必要なら cabal を使い,そうでなければ apt が楽です。

cabal install gtk2hs-buildtools
cabal install gtk
cabal install chart

または

sudo aptitude install libghc-chart-dev

ちなみに cabal の方は libgtk2.0-dev 等のパッケージを別途インストールする必要があります。 cabal を使って必要なパッケージがなければエラーメッセージが出るので,随時入れていく感じになります。さらに公式リポジトリのパッケージのバージョンの問題があるので, Ubuntu の場合はリポジトリにあるパッケージのモジュールだとバージョンが古くて利用できない場合があります。なので cabal でインストールしたパッケージを優先的に使用する必要があります。

Windows にインストールしようとしたら pkg-config が必要と言われたので諦めました。

使い方

Chart パッケージのホームページ にいくつかサンプルがあります。サンプルデータが見当たらないので,実際に自分で試せるのはほとんどありませんが,サンプルコードは役に立ちます。

サンプルコードを見ると概ねプロットの中身を決め,それらのレイアウトを決めるという形になっているようです。プロットする種類 (hoge) とその属性 (foo) を指定する関数 plot_hoge_foo と具体的な値を (^=)($) で連鎖し,最終的に defaultPlotHoge に落とし込むような感じです。レイアウトも同様。

import Data.Accessor
import Graphics.Rendering.Chart

plotLines = plot_lines_values ^= [[(0, 0), (1, 1) :: (Integer, Integer)]]
$ plot_lines_title ^= title
...
$ defaultPlotLines

layout = layout1_plots ^= [Left (toPlot plotLines)]
$ layout1_title ^= title
...
$ defaultLayout1

renderableToPNGFile (toRenderable layout) width height "out.png"

出力先は PNG やウィンドウの他に PDF, Postscript, SVG があります。

関数のリストを見ると,軸のスタイルが指定できたり,もっと色々できるようですが,まだ使い方がよくわかっていません。公式の例はちょっと少ないので, R Graphical ManualR Graph Gallery みたいなサイトがあるといいですね。

等高線を描いてみた

せっかくなので手元にあった 200×200 点 (50 メートルメッシュ) の標高データを用いて等高線を引いてみました。

キャプションにもある通り富士山です。 1,000 メートルから 250 メートル間隔で等高線を引いています。ちゃんと日本語も扱えていますね。

ソースコード

ソースコードを Bitbucket にアップロードしています。標高データは付属していません。

まとめ

Chart パッケージを使うと数値計算からグラフ描画までを Haskell だけで行えるので良いですね。

脚注

  1. グラフを描画するパッケージは, Chart パッケージの他に gnuplot のラッパーである Gnuplot パッケージ もあります。 []