-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.Plot
-- Copyright   :  (c) A. V. H. McPhail 2010
-- License     :  BSD3
--
-- Maintainer  :  haskell.vivian.mcphail <at> gmail <dot> com
-- Stability   :  provisional
-- Portability :  portable
--
-- Graphical plots
--
-----------------------------------------------------------------------------

module Graphics.Rendering.Plot (
                                -- * Re-exported for convenience
                                module Graphics.Rendering.Plot.Figure.Simple
                               , module Graphics.Rendering.Plot.Figure
                               , module Graphics.Rendering.Plot.Render
                                -- * Example
                                -- $example
                               ) where


-----------------------------------------------------------------------------

import Graphics.Rendering.Plot.Figure.Simple
import Graphics.Rendering.Plot.Figure
import Graphics.Rendering.Plot.Render

-----------------------------------------------------------------------------
{- $example

Create some data:

> ln = 25
> ts = linspace ln (0,1)
> rs = randomVector 0 Gaussian ln
> 
> ss = sin (15*2*pi*ts)
> ds = 0.25*rs + ss
> es = constant (0.25*(stddev rs)) ln
> 
> fs :: Double -> Double
> fs = sin . (15*2*pi*)

Perform actions in 'Figure a' to create a figure

> test_graph = do
>         withTextDefaults $ setFontFamily "OpenSymbol"
>         withTitle $ setText "Testing plot package:"
>         withSubTitle $ do
>                        setText "with 1 second of a 15Hz sine wave"
>                        setFontSize 10
>         setPlots 1 1
>         withPlot (1,1) $ do
>                          setDataset (ts,[point (ds,es) (Cross,red),line fs blue])
>                          addAxis XAxis (Side Lower) $ withAxisLabel $ setText "time (s)"
>                          addAxis YAxis (Side Lower) $ withAxisLabel $ setText "amplitude"
>                          addAxis XAxis (Value 0) $ return ()
>                          setRangeFromData XAxis Lower Linear
>                          setRange YAxis Lower Linear (-1.25) 1.25
 
Render the graph to a Cairo 'Render ()' action that takes the width
and height of the drawing area

> test_render :: (Double,Double) -> Render ()
> test_render = render test_graph

The same graph using the 'Simple' interface

> test_graph2 = do
>         plot (ts,[point (ds,es) (Cross,red),line fs blue])
>         title "Testing plot package:"
>         subtitle "with 1 second of a 15Hz sine wave"
>         xlabel "time (s)"
>         ylabel "amplitude"
>         yrange Linear (-1.25) 1.25

The 'Render a' action can be used in GTK or with Cairo to write to file in PS, PDF, SVG, or PNG

Display a greyscale matrix

> ms :: Matrix Double
> ms = buildMatrix 64 64 (\(x,y) -> sin (2*2*pi*(fromIntegral x)/64) * cos (5*2*pi*(fromIntegral y)/64))

> mat_fig = do
>         setPlots 1 1
>         withPlot (1,1) $ do 
>                          setDataset ms
>                          addAxis XAxis (Side Lower) $ setTickLabelFormat "%.0f"
>                          addAxis YAxis (Side Lower) $ setTickLabelFormat "%.0f"
>                          setRangeFromData XAxis Lower Linear
>                          setRangeFromData YAxis Lower Linear

The ODE example from hmatrix:

> import Numeric.GSL
> import Numeric.LinearAlgebra

> xdot t [x,v] = [v, -0.95*x - 0.1*v]
> ts = linspace 100 (0,20)
> sol = odeSolve xdot [10,0] ts

> ode_fig = plot (Line,ts,[sol])

-}

-----------------------------------------------------------------------------