[Haskell-cafe] Experimenting a new plotting library
Tim Docker
tim at dockerz.net
Sun May 4 21:14:08 UTC 2014
Some of the things that increase the complexity of the chart library are:
- strongly typed axes (the library would be somewhat simpler if all axes were just doubles)
- achieving a balance between useful defaults and flexibility
- constraints between distinct visual elements
- the lack of “first class" text handling in the current diagrams library
I’ll follow your experiments with interest.
Tim
On 5 May 2014, at 3:58 am, Kai Zhang <kai at kzhang.org> wrote:
> Hi Tim,
>
> Thank you for commenting. As I said before, Chart is a wonderful library. Although it has most features we need, I personally feel that it's cumbersome to make plots or define new plots by Chart. So I would like to experiment a new library which makes this process more natural and intuitive. For example, to make a plot, we can
>
> 1. generate axes from data by calling:
>
> xAxis = realAxis rangeOfX padding opts
> yAxis = realAxis rangeOfY padding opts
>
> 2. Assemble axes:
>
> area = plotArea 5.5 4.8
> ( yAxis -- left axis
> , def -- top axis, using default axis which is a line
> , def -- right axis
> , xAxis -- bottom axis
> )
>
> 3. make delayed plots which are functions. Given a point map provided by plot area, they can generate actual plots.
>
> ps = points xs ys def
> l = line xs ys def
>
> 3. attach any number and any types of plots to plot area:
>
> plot = area <+ (ps, BL) <+ (l, BL)
>
> We have four axes in plot area, so you can attach plots to plot area by any two of the axes, for example, you can do
>
> area <+ (ps, BR) <+ (l, BL) <+ (l, TL) <+ (l, TR)
>
> Each intermediate step can be easily customized separately and independently without worrying about other parts. And styling can be done by calling APIs of Diagrams.
>
>
> On Sun, May 4, 2014 at 4:10 AM, Tim Docker <tim at dockerz.net> wrote:
>
> On 3 May 2014, at 7:44 am, Kai Zhang <kai at kzhang.org> wrote:
>
> > 1. There is few plotting library written in pure Haskell
> > 2. Haskell-chart, one of the most featured library, is hard to extend and there is no straightforward way to compose or modify the plots generated by this library.
>
> The chart library is pure haskell when using the diagrams backend.
>
> What do you mean by compose or modify the plots? It’s reasonably straightforward to have it produce a diagram, which can then be composed or modified with any of the diagrams tools. Some sample code is shown below.
>
> Tim (chart library maintainer)
>
>
> {-# LANGUAGE FlexibleContexts #-}
> import Graphics.Rendering.Chart
> import Data.Colour
> import Data.Colour.Names
> import Data.Colour.SRGB
> import Control.Lens
> import Data.Default.Class
>
> import Graphics.Rendering.Chart.Backend.Diagrams
> import qualified Diagrams.Prelude as D
> import qualified Diagrams.Backend.SVG as D
>
> chart :: Renderable (LayoutPick Double Double Double)
> chart = layoutToRenderable
> $ layout_title .~ "Amplitude Modulation"
> $ layout_plots .~ [toPlot sinusoid1]
> $ layout_plot_background .~ Just (solidFillStyle $ opaque white)
> $ def
> where
> am x = (sin (x*pi/45) + 1) / 2 * (sin (x*pi/5))
>
> sinusoid1 = plot_lines_values .~ [[ (x,(am x)) | x <- [0,(0.5)..400]]]
> $ plot_lines_style .~ solidLine 1 (opaque blue)
> $ plot_lines_title .~"am"
> $ def
>
> mkDiagram :: (D.Backend b D.R2, D.Renderable (D.Path D.R2) b) => IO (D.Diagram b D.R2)
> mkDiagram = do
> env <- defaultEnv vectorAlignmentFns 800 400
> return (fst (runBackendR env chart))
>
>
More information about the Haskell-Cafe
mailing list