Chart 1.1 → 1.2
raw patch · 5 files changed
+22/−327 lines, 5 files
Files
- Chart.cabal +1/−3
- Graphics/Rendering/Chart.hs +20/−16
- Graphics/Rendering/Chart/Simple.hs +0/−38
- Graphics/Rendering/Chart/Simple/Internal.hs +0/−269
- Graphics/Rendering/Chart/SparkLine.hs +1/−1
Chart.cabal view
@@ -1,5 +1,5 @@ Name: Chart-Version: 1.1+Version: 1.2 License: BSD3 License-file: LICENSE Copyright: Tim Docker, 2006-2010@@ -36,8 +36,6 @@ Graphics.Rendering.Chart.Axis.Unit, Graphics.Rendering.Chart.Layout, Graphics.Rendering.Chart.Legend,- Graphics.Rendering.Chart.Simple,- Graphics.Rendering.Chart.Simple.Internal, Graphics.Rendering.Chart.Grid, Graphics.Rendering.Chart.Plot, Graphics.Rendering.Chart.Plot.Types,
Graphics/Rendering/Chart.hs view
@@ -1,32 +1,36 @@ ---------------------------------------------------------------------------- -- | -- Module : Graphics.Rendering.Chart--- Copyright : (c) Tim Docker 2006+-- Copyright : (c) Tim Docker 2006-2013 -- License : BSD-style (see chart/COPYRIGHT) -- -- A framework for creating 2D charts in Haskell. ----- The basic model is that you define a value of type 'Renderable',--- typically by applying 'toRenderable' to some other value. This--- 'Renderable' is then actually displayed or output by calling either--- 'renderableToPNGFile', or 'renderableToWindow'.+-- The basic model is that you define a value representing a chart to+-- be displayed, and then convert it to a 'Renderable' by applying+-- 'toRenderable'. This 'Renderable' is then actually output by+-- calling a function in an appropriate graphics backend, eg+-- 'renderableToFile'. ----- Currently, there are two kinds of 'Renderable' for displaying charts:+-- Currently, there are three types of charts: ----- * a standard two axes chart can be is created by applying--- 'toRenderable' to a value of type 'Layout1'+-- * 'Layout' is a standard XY chart+-- +-- * 'LayoutLR' is an XY chart with independent left+-- and right axes ----- * a pie chart can be is created by applying--- 'toRenderable' to a value of type 'PieLayout'+-- * 'PieLayout' is a pie chart ----- Multiple Renderables can be composed using the "Graphics.Rendering.Chart.Grid" module.+-- 'Layout' and 'LayoutLR' charts can be stacked vertically using+-- the 'StackedLayouts' type.+-- +-- 'Renderable's can be composed in arbitrary ways using the+-- "Graphics.Rendering.Chart.Grid" module. -- -- Many of the record structure involved in the API have a large--- number of fields. For each record type X, there is generally a--- default value called defaultX with sensibly initialised fields.--- For example, 'Layout1' has 'defaultLayout1', etc.------ For a simpler though less flexible API, see "Graphics.Rendering.Chart.Simple".+-- number of fields. 'Lens'es are provided to access each field. Also,+-- for each record type, there is generally a default value, which can+-- be accessed through the 'def' value of the 'Default' typeclass. -- -----------------------------------------------------------------------------
− Graphics/Rendering/Chart/Simple.hs
@@ -1,38 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Graphics.Rendering.Chart.Simple--- Copyright : (c) David Roundy 2007--- License : BSD-style (see chart/COPYRIGHT)------ An even simpler framework for creating 2D charts in Haskell.------ The basic idea is to make it as easy to plot as octave, which means that--- you provide no more information than you wish to provide. We provide--- four plotting functions, which differ only in their output. One--- produces a "Layout1" that you can customize using other--- Graphics.Rendering.Chart functions. The other three produce their--- output directly. All three accept the same input and produce the same plots.------ The plot functions accept a variable number of arguments. You must--- provide a [Double] which defines the points on the x axis, which must--- precede any of the "y" values. The y values may either be [Double] or--- functions. After any given y value, you can give either Strings or--- PlotKinds describing how you'd like that y printed.------ Examples:------ > plotPDF "foo.pdf" [0,0.1..10] sin "- " cos ". " cos "o"------ > plotPS "foo.ps" [0,0.1..10] (sin . exp) "- " (sin . exp) "o-"-------------------------------------------------------------------------------module Graphics.Rendering.Chart.Simple( plot, PlotKind(..), xcoords,- plotPDF, plotPS,- plotLayout, plotPNG, LayoutDDD,- layoutDddToRenderable- , PlotPDFType(..)- , PlotPSType(..)- , PlotPNGType(..)- , uplot- ) where--import Graphics.Rendering.Chart.Simple.Internal
− Graphics/Rendering/Chart/Simple/Internal.hs
@@ -1,269 +0,0 @@--module Graphics.Rendering.Chart.Simple.Internal where--import Data.Maybe ( catMaybes )-import Data.Colour-import Data.Colour.Names-import Data.Default.Class--import Graphics.Rendering.Chart-import Graphics.Rendering.Chart.Utils---styleColor :: Int -> AlphaColour Double-styleColor ind = colorSequence !! ind- where colorSequence = cycle $ map opaque [ blue, red, green, yellow- , cyan, magenta, black ]--styleSymbol :: Int -> PlotKind-styleSymbol ind = symbolSequence !! ind- where symbolSequence = cycle [ Ex, HollowCircle, Square, Diamond- , Triangle, DownTriangle, Plus, Star- , FilledCircle ]--iplot :: (PlotValue x, PlotValue y) => [InternalPlot x y] -> Layout x y-iplot foobar = def {- _layout_plots = concat $ zipWith toplot (ip foobar) [0..]- }- where- ip (xs@(IPX _ _):xyss) = map (\ys -> (xs,ys)) yss ++ ip rest- where yss = takeWhile isIPY xyss- rest = dropWhile isIPY xyss- ip (_:xyss) = ip xyss- ip [] = []- isIPY (IPY _ _) = True- isIPY _ = False- toplot (IPX xs _, IPY ys yks) ind = plots- where- vs = zip xs ys- plots = case catMaybes $ map plotas yks of- [] -> [ toPlot $ def- { _plot_lines_title = name yks,- _plot_lines_values = [vs],- _plot_lines_style = solidLine 1 (styleColor ind)- } ]- xs -> xs- plotas Solid = Just $ toPlot $ def- { _plot_lines_title = name yks,- _plot_lines_values = [vs],- _plot_lines_style = solidLine 1 (styleColor ind) }- plotas Dashed = Just $ toPlot $ def- { _plot_lines_title = name yks,- _plot_lines_values = [vs],- _plot_lines_style = dashedLine 1 [10,10]- (styleColor ind) }- plotas Dotted = Just $ toPlot $ def- { _plot_lines_title = name yks,- _plot_lines_values = [vs],- _plot_lines_style = dashedLine 1 [1,11]- (styleColor ind) }- plotas FilledCircle = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = filledCircles 4- (styleColor ind) }- plotas HollowCircle = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = hollowCircles 5 1- (styleColor ind) }- plotas Triangle = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = hollowPolygon 7 1 3 False- (styleColor ind) }- plotas DownTriangle = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = hollowPolygon 7 1 3 True- (styleColor ind) }- plotas Square = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = hollowPolygon 7 1 4 False- (styleColor ind) }- plotas Diamond = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = hollowPolygon 7 1 4 True- (styleColor ind) }- plotas Plus = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = plusses 7 1 (styleColor ind) }- plotas Ex = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = exes 7 1 (styleColor ind) }- plotas Star = Just $ toPlot $ def- { _plot_points_title = name yks,- _plot_points_values = vs,- _plot_points_style = stars 7 1 (styleColor ind) }- plotas Symbols = plotas (styleSymbol ind)- plotas _ = Nothing--name :: [PlotKind] -> String-name (Name s:_) = s-name (_:ks) = name ks-name [] = ""--str2k :: String -> [PlotKind]-str2k "" = []-str2k ". " = [Dotted]-str2k s@('?':_) = str2khelper s Symbols-str2k s@('@':_) = str2khelper s FilledCircle-str2k s@('#':_) = str2khelper s Square-str2k s@('v':_) = str2khelper s DownTriangle-str2k s@('^':_) = str2khelper s Triangle-str2k s@('o':_) = str2khelper s HollowCircle-str2k s@('+':_) = str2khelper s Plus-str2k s@('x':_) = str2khelper s Ex-str2k s@('*':_) = str2khelper s Star-str2k s@('.':_) = str2khelper s LittleDot-str2k "- " = [Dashed]-str2k "-" = [Solid]-str2k n = [Name n]--str2khelper :: String -> PlotKind -> [PlotKind]-str2khelper s@(_:r) x = case str2k r of- [] -> [x]- [Name _] -> [Name s]- xs -> x:xs---- | Type to define a few simple properties of each plot.-data PlotKind = Name String | FilledCircle | HollowCircle- | Triangle | DownTriangle | Square | Diamond- | Plus | Ex | Star | Symbols- | LittleDot | Dashed | Dotted | Solid- deriving ( Eq, Show, Ord )-data InternalPlot x y = IPY [y] [PlotKind] | IPX [x] [PlotKind]--newtype LayoutDDD = LayoutDDD { plotLayout :: Layout Double Double }--layoutDddToRenderable :: LayoutDDD -> Renderable (LayoutPick Double Double Double)-layoutDddToRenderable = layoutToRenderable . plotLayout--instance ToRenderable LayoutDDD where- toRenderable = setPickFn nullPickFn . toRenderable--uplot :: [UPlot] -> LayoutDDD-uplot us = LayoutDDD $ iplot $ nameDoubles $ evalfuncs us- where- nameDoubles :: [UPlot] -> [InternalPlot Double Double]- nameDoubles (X xs: uus) = case grabName uus of- (ks,uus') -> IPX (filter isValidNumber xs) ks- : nameDoubles uus'- nameDoubles (UDoubles xs:uus)= case grabName uus of- (ks,uus') -> IPY (filter isValidNumber xs) ks- : nameDoubles uus'- nameDoubles (_:uus) = nameDoubles uus- nameDoubles [] = []- evalfuncs :: [UPlot] -> [UPlot]- evalfuncs (UDoubles xs:uus) = X xs : map ef (takeWhile (not.isX) uus)- ++ evalfuncs (dropWhile (not.isX) uus)- where ef (UFunction f) = UDoubles (map f xs)- ef u = u- evalfuncs (X xs:uus) = X xs : map ef (takeWhile (not.isX) uus)- ++ evalfuncs (dropWhile (not.isX) uus)- where ef (UFunction f) = UDoubles (map f xs)- ef u = u- evalfuncs (u:uus) = u : evalfuncs uus- evalfuncs [] = []- grabName :: [UPlot] -> ([PlotKind],[UPlot])- grabName (UString n:uus) = case grabName uus of- (ks,uus') -> (str2k n++ks,uus')- grabName (UKind ks:uus) = case grabName uus of- (ks',uus') -> (ks++ks',uus')- grabName uus = ([],uus)- isX (X _) = True- isX _ = False---- | The main plotting function. The idea behind PlotType is shamelessly--- copied from Text.Printf (and is not exported). All you need to know is--- that your arguments need to be in class PlotArg. And PlotArg consists--- of functions and [Double] and String and PlotKind or [PlotKind].--plot :: PlotType a => a-plot = pl []-class PlotType t where- pl :: [UPlot] -> t-instance (PlotArg a, PlotType r) => PlotType (a -> r) where- pl args = \ a -> pl (toUPlot a ++ args)-instance PlotType LayoutDDD where- pl args = uplot (reverse args)---- | Save a plot as a PDF file.--plotPDF :: PlotPDFType a => String -> a-plotPDF fn = pld fn []-class PlotPDFType t where- pld :: FilePath -> [UPlot] -> t-instance (PlotArg a, PlotPDFType r) => PlotPDFType (a -> r) where- pld fn args = \ a -> pld fn (toUPlot a ++ args)---- | Save a plot as a postscript file.--plotPS :: PlotPSType a => String -> a-plotPS fn = pls fn []-class PlotPSType t where- pls :: FilePath -> [UPlot] -> t-instance (PlotArg a, PlotPSType r) => PlotPSType (a -> r) where- pls fn args = \ a -> pls fn (toUPlot a ++ args)---- | Save a plot as a png file.-plotPNG :: PlotPNGType a => String -> a-plotPNG fn = plp fn []--class PlotPNGType t where- plp :: FilePath -> [UPlot] -> t-instance (PlotArg a, PlotPNGType r) => PlotPNGType (a -> r) where- plp fn args = \ a -> plp fn (toUPlot a ++ args)--data UPlot = UString String | UDoubles [Double] | UFunction (Double -> Double)- | UKind [PlotKind] | X [Double]--xcoords :: [Double] -> UPlot-xcoords = X--class PlotArg a where- toUPlot :: a -> [UPlot]--instance IsPlot p => PlotArg [p] where- toUPlot = toUPlot'--instance (Real a, Real b, Fractional a, Fractional b) => PlotArg (a -> b) where- toUPlot x = [UFunction (realToFrac . x . realToFrac)]--instance (Real a, Real b, Fractional a, Fractional b) => IsPlot (a -> b) where- toUPlot' = reverse . concatMap f- where f x = [UFunction (realToFrac . x . realToFrac)]--instance PlotArg UPlot where- toUPlot = (:[])--instance PlotArg PlotKind where- toUPlot = (:[]) . UKind . (:[])---class IsPlot c where- toUPlot' :: [c] -> [UPlot]--instance IsPlot PlotKind where- toUPlot' = (:[]) . UKind--instance IsPlot Double where- toUPlot' = (:[]) . UDoubles--instance IsPlot Char where- toUPlot' = (:[]) . UString--instance IsPlot p => IsPlot [p] where- toUPlot' = reverse . concatMap toUPlot'--instance (IsPlot p, IsPlot q, IsPlot r) => IsPlot (p,q,r) where- toUPlot' = reverse . concatMap f- where f (p,q,r) = toUPlot' [p] ++ toUPlot' [q] ++ toUPlot' [r]--instance (IsPlot p, IsPlot q) => IsPlot (p,q) where- toUPlot' = reverse . concatMap f- where f (p,q) = toUPlot' [p] ++ toUPlot' [q]
Graphics/Rendering/Chart/SparkLine.hs view
@@ -92,7 +92,7 @@ sparkLineToRenderable :: SparkLine -> Renderable () sparkLineToRenderable sp = Renderable- { minsize = return (0, fromIntegral (so_height (sl_options sp)))+ { minsize = let (w,h) = sparkSize sp in return (fromIntegral w , fromIntegral h) , render = \_rect-> renderSparkLine sp }