Chart-0.14: Graphics/Rendering/Chart/Plot/Types.hs
-----------------------------------------------------------------------------
-- |
-- Module : Graphics.Rendering.Chart.Plot.Types
-- Copyright : (c) Tim Docker 2006
-- License : BSD-style (see chart/COPYRIGHT)
--
-- Datatypes and functions common to the implementation of the various
-- plot types.
--
{-# OPTIONS_GHC -XTemplateHaskell #-}
module Graphics.Rendering.Chart.Plot.Types(
Plot(..),
joinPlot,
ToPlot(..),
mapXY,
plot_render,
plot_legend,
plot_all_points,
) where
import qualified Graphics.Rendering.Cairo as C
import Graphics.Rendering.Chart.Types
import Graphics.Rendering.Chart.Renderable
import Control.Monad
import Data.Accessor.Template
import Data.Colour
import Data.Colour.Names
-- | Interface to control plotting on a 2D area.
data Plot x y = Plot {
-- | Given the mapping between model space coordinates and device
-- coordinates, render this plot into a chart.
plot_render_ :: PointMapFn x y -> CRender (),
-- | Details for how to show this plot in a legend. For each item
-- the string is the text to show, and the function renders a
-- graphical sample of the plot.
plot_legend_ :: [ (String, Rect -> CRender ()) ],
-- | All of the model space coordinates to be plotted. These are
-- used to autoscale the axes where necessary.
plot_all_points_ :: ([x],[y])
}
-- | A type class abstracting the conversion of a value to a Plot.
class ToPlot a where
toPlot :: a x y -> Plot x y
-- | Join any two plots together (they will share a legend).
joinPlot :: Plot x y -> Plot x y -> Plot x y
joinPlot Plot{ plot_render_ = renderP
, plot_legend_ = legendP
, plot_all_points_ = (xsP,ysP) }
Plot{ plot_render_ = renderQ
, plot_legend_ = legendQ
, plot_all_points_ = (xsQ,ysQ) }
= Plot{ plot_render_ = \a-> renderP a >> renderQ a
, plot_legend_ = legendP ++ legendQ
, plot_all_points_ = ( xsP++xsQ, ysP++ysQ )
}
----------------------------------------------------------------------
mapXY :: PointMapFn x y -> ((x,y) -> Point)
mapXY f (x,y) = f (LValue x, LValue y)
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Template haskell to derive an instance of Data.Accessor.Accessor
-- for each field.
$( deriveAccessors ''Plot )