packages feed

HPlot-0.3: Example.hs

-- |
--
-- Demonstrates the basic usage of the PlplotCanvas
-- to embed a plot in a Gnome application.
--
-- (C) Yakov ZAYTSEV, Roman Salmin, 2009
--
module Main where

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Glade
import Graphics.UI.Gtk.Gdk.Events

import Graphics.PLplot

type PlotData = [(Double, Double)]

data1 = [(i, i*i / 10) | i <- [1..10]] :: PlotData
data2 = [(i, 5 - abs (i - 5)) | i <- [0..10]] :: PlotData

main = drawWithHPlot example2

example2 :: (PLplot p) => PLplotM p ()
example2 = do
  ssub 2 1
  adv 0
  plotList [(line, data1, ["x", "y", "y = x*x / 10"])
          , (bin [BinCentred], data2, ["some", "some value", "something"])]

plotList :: (PLplot p) => [(PlotData -> PLplotM p (), PlotData, [String])]-> PLplotM p ()
plotList [] = adv 0
plotList (x:xs) = plotOneHlp x >> adv 0 >> plotList xs

plotOneHlp :: (PLplot p) => (PlotData -> PLplotM p (), PlotData, [String])-> PLplotM p ()
plotOneHlp (f, content, titles) = do
  col0 15 -- Set color to black
  wid 2 -- Set the pen width
  vsta -- Set the viewport

  let minx = minimum $ map fst content
  let maxx = maximum $ map fst content
  let miny =  minimum $ map snd content
  let maxy = maximum $ map snd content

  wind (minx - 0.5)  (maxx + 0.5)  miny (maxy + 1) -- Set the window

  box "bcnst" 0.0 0 "bcnstv" 0.0 0 -- Set the box
  lab (titles !! 0) (titles !! 1)  (titles !! 2) -- Draw some labels

  -- Draw the line
  col0 1 -- Set the pen color
  f content


drawWithHPlot :: PLplotM PlplotCanvas () -> IO ()
drawWithHPlot plotf = do
  initGUI
  Just xml <- xmlNew "example.glade"
  window1 <- xmlGetWidget xml castToWindow "window1"
  onDestroy window1 mainQuit
  onKeyPress window1 keyHandler
  canvas <- plplotCanvasNew
  plplotCanvasSetSize canvas 1000 700
  containerAdd window1 canvas
  widgetShowAll window1
  runPLplot canvas $ plotf
  mainGUI


keyHandler :: Event -> IO Bool
keyHandler ekey = do
  let key = eventKeyName ekey
  if (key == "q" || key == "Q")
    then mainQuit >> return True
    else return True