Haskellでgtk+でプロット

  • ハスケルプログラムを実行して、ヒョイ、画面を立ち上げるようにしてプロットしたい
  • ただし、プロットはRでやることにするほうが良さそう(こちら)
  • ヒョイ、の仕組みとしてgtk+というのがある(こちら)
  • 一応、マルチプラットフォームだそうだが、Windowsでは苦戦するらしい(自分でも、苦戦、ウェブ上にも苦戦(諦め)談多数)
  • ということでUbuntuでやる
  • 色々情報はあるのだが、今、この時点での成功例は以下の通り
  • こちらにあるように、Ubuntuaptitudeで入れる
  • まず、aptitude (apt-getの良くなったものらしい)を入れる
$ sudo apt-get install aptitude
  • ついで
sudo aptitude install libghc-chart-dev
  • その後、stack buildすると、あれがない、これがない。あれをバージョンつきでyamlに書け、と言われるのでそれに従う
  • 以下は、stack new plot して作った環境(plot という名前のプロジェクトを作成した)に、上記のlibghc-chart-devしたあとで、書き換えたcabal, yamlとこちらから取ってきたMain.hsファイルを app/Main.hsとして、stack buildしたもの
    • cabal
executable plot-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , plot
                     , gtk2hs-buildtools
                     , gtk
                     , Chart
                     , colour
                     , data-default-class
                     , Chart-cairo
                     , lens
                     , Chart-diagrams
                     , Chart-gtk
  default-language:    Haskell2010
extra-deps:
- Chart-1.8.2
- Chart-cairo-1.8.2
- Chart-gtk-1.8.2
    • Main.hs
module Main where

--グラフの定義
import Graphics.Rendering.Chart

--系列の色指定
import Data.Colour
import Data.Colour.Names

--デフォルト値適用
import Data.Default.Class

--グラフ描画(画像ファイル出力)
import Graphics.Rendering.Chart.Backend.Cairo
--グラフ描画(GUI)
import Graphics.Rendering.Chart.Gtk

--「.~」演算子
import Control.Lens

chart :: Renderable ()
chart = toRenderable layout
    where
        --2次関数
        quad :: Double -> Double
        quad = (**2)

        --1つ目の系列
        pl = plot_lines_values .~ [[ (x, (quad x)) | x <- [-50..50]]]
            $ plot_lines_style . line_color .~ opaque blue
            $ plot_lines_style . line_width .~ 3
            $ plot_lines_title .~ "plot_lines"
            $ def

        --2つ目の系列
        pp = plot_points_values .~ [ (x, (quad x)) | x <- [-50,-45..50]]
            $ plot_points_style .~ filledPolygon 5 4 False (opaque magenta)
            $ plot_points_title .~ "plot_points"
            $ def

        --グラフ
        layout = layout_title .~ "y=x^2"
            $ layout_plots .~ [toPlot pl, toPlot pp]
            $ def

main :: IO ()
main = do
    --画像ファイル(PNG形式)出力
    _ <- renderableToFile def "quad.png" chart
    --画面表示
    renderableToWindow chart 640 480
stack build
stack exec plot-exe