<div dir="ltr"><div class="gmail_default" style="font-size:small">Hi Tim,</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">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</div>
<div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">1. generate axes from data by calling:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">
    xAxis = <span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">realAxis rangeOfX padding opts</span></div><div class="gmail_default" style="font-size:small">
<span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">  </span><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">yAxis = realAxis rangeOfY padding opts</span></div>
<div class="gmail_default" style="font-size:small"><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)"><br></span></div>
<div class="gmail_default" style="font-size:small"><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">2. Assemble axes:</span></div>
<div class="gmail_default" style="font-size:small"><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)"><br></span></div>
<div class="gmail_default" style><span style="background-color:transparent;font-size:12px"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><div class="gmail_default" style>area = plotArea 5.5 4.8</div>
<div class="gmail_default" style>       ( yAxis  -- left axis</div><div class="gmail_default" style>       , def  -- top axis, using default axis which is a line</div><div class="gmail_default" style>       , def  -- right axis</div>
<div class="gmail_default" style>       , xAxis -- bottom axis</div><div class="gmail_default" style>       )</div><div class="gmail_default" style><br></div><div class="gmail_default" style>3. make delayed plots which are functions. Given a point map provided by plot area, they can generate actual plots.</div>
<div class="gmail_default" style> </div></font></span></div><div class="gmail_default" style="font-size:small"><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">   </span><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">ps = points xs ys def</span></div>
<div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px">   l = line xs ys def</span></font><br></span></div>
<div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px"><br></span></font></span></div><div class="gmail_default" style="font-size:small">
<span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">3. attach any number and any types of plots to plot area:</span></div>
<div class="gmail_default" style="font-size:small"><span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)"><br></span></div>
<div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px">    plot = area <+ (ps, BL) <+ (l, BL)</span></font><br>
</span></div><div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px">    </span></font></span></div>
<div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px">    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</span></font></span></div>
<div class="gmail_default" style><span style="background-color:transparent"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px"><br></span></font></span></div><div class="gmail_default" style="font-size:small">
<span style="background-color:transparent;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:inherit;color:rgb(51,51,51)">    </span><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px">area <+ (ps, BR) <+ (l, BL) <+ (l, TL) <+ (l, TR)</span></div>
<div class="gmail_default" style="font-size:small"><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px"><br></span></div><div class="gmail_default"><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px">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.</span></font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, May 4, 2014 at 4:10 AM, Tim Docker <span dir="ltr"><<a href="mailto:tim@dockerz.net" target="_blank">tim@dockerz.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class=""><br>
On 3 May 2014, at 7:44 am, Kai Zhang <<a href="mailto:kai@kzhang.org">kai@kzhang.org</a>> wrote:<br>
<br>
> 1. There is few plotting library written in pure Haskell<br>
> 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.<br>
<br>
</div>The chart library is pure haskell when using the diagrams backend.<br>
<br>
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.<br>
<br>
Tim (chart library maintainer)<br>
<br>
<br>
{-# LANGUAGE FlexibleContexts #-}<br>
import Graphics.Rendering.Chart<br>
import Data.Colour<br>
import Data.Colour.Names<br>
import Data.Colour.SRGB<br>
import Control.Lens<br>
import Data.Default.Class<br>
<br>
import Graphics.Rendering.Chart.Backend.Diagrams<br>
import qualified Diagrams.Prelude as D<br>
import qualified Diagrams.Backend.SVG as D<br>
<br>
chart :: Renderable (LayoutPick Double Double Double)<br>
chart = layoutToRenderable<br>
      $ layout_title .~ "Amplitude Modulation"<br>
      $ layout_plots .~ [toPlot sinusoid1]<br>
      $ layout_plot_background .~ Just (solidFillStyle $ opaque white)<br>
      $ def<br>
  where<br>
    am x = (sin (x*pi/45) + 1) / 2 * (sin (x*pi/5))<br>
<br>
    sinusoid1 = plot_lines_values .~ [[ (x,(am x)) | x <- [0,(0.5)..400]]]<br>
              $ plot_lines_style  .~ solidLine 1 (opaque blue)<br>
              $ plot_lines_title .~"am"<br>
              $ def<br>
<br>
mkDiagram :: (D.Backend b D.R2, D.Renderable (D.Path D.R2) b) => IO (D.Diagram b D.R2)<br>
mkDiagram = do<br>
    env <- defaultEnv vectorAlignmentFns 800 400<br>
    return (fst (runBackendR env chart))<br>
<br>
</blockquote></div><br></div>