先日『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 Manual や R Graph Gallery みたいなサイトがあるといいですね。
等高線を描いてみた
せっかくなので手元にあった 200×200 点 (50 メートルメッシュ) の標高データを用いて等高線を引いてみました。
キャプションにもある通り富士山です。 1,000 メートルから 250 メートル間隔で等高線を引いています。ちゃんと日本語も扱えていますね。
ソースコード
ソースコードを Bitbucket にアップロードしています。標高データは付属していません。
まとめ
Chart パッケージを使うと数値計算からグラフ描画までを Haskell だけで行えるので良いですね。
脚注
- グラフを描画するパッケージは, Chart パッケージの他に gnuplot のラッパーである Gnuplot パッケージ もあります。 [↩]