plot-light 0.2.9 → 0.3
raw patch · 13 files changed
+112/−491 lines, 13 filesdep −attoparsecdep −attoparsec-timedep −palettedep ~basePVP ok
version bump matches the API change (PVP)
Dependencies removed: attoparsec, attoparsec-time, palette
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.TimeSeries: halfHourTick :: Double
+ Data.TimeSeries: halfHourTick :: Rational
- Data.TimeSeries: hourTick :: Double
+ Data.TimeSeries: hourTick :: Rational
- Data.TimeSeries: quarterHourTick :: Double
+ Data.TimeSeries: quarterHourTick :: Rational
Files
- CHANGELOG.md +9/−0
- app/heatmap/Main.hs +0/−96
- app/scatter/Main.hs +0/−47
- app/timeseries/Main.hs +0/−93
- data/forex +0/−174
- data/heatmap-bw +0/−6
- plot-light.cabal +11/−56
- src/Data/Parsers.hs +4/−4
- src/Data/TimeSeries.hs +13/−5
- src/Graphics/Rendering/Plot/Light/Internal/Geometry.hs +69/−4
- src/Graphics/Rendering/Plot/Light/PlotTypes/Heatmap.hs +1/−1
- src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs +1/−1
- src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs +4/−4
CHANGELOG.md view
@@ -1,2 +1,11 @@+ 0.3++ Stackage LTS bump to 11.0 (GHC 8.4.1)+ Removed dependencies: palette, attoparsec+ Moved data and examples to plot-light-examples+ Add bilinear interpolation+ + 0.2.9+ Bumped attoparsec-time to >= 1 to reflect module structure change
− app/heatmap/Main.hs
@@ -1,96 +0,0 @@-module Main where---- import Control.Monad (forM_)--- import Data.Ratio--import Graphics.Rendering.Plot.Light-import Graphics.Rendering.Plot.Light.PlotTypes--import qualified Data.Attoparsec.Text as A-import qualified Data.Text as T -import qualified Data.Text.IO as T (readFile, writeFile)-import Data.Scientific (Scientific, toRealFloat)-import Text.Blaze.Svg.Renderer.String (renderSvg)-import Text.Blaze.Svg--import qualified Data.Colour.Names as C-import qualified Data.Colour as C-import qualified Data.Colour.Palette.BrewerSet as CP-import qualified Data.Colour.Palette.Harmony as CH---fname = "data/heatmap-bw"--xPlot = 400-yPlot = 300-fnameOut = "data/heatmap-1.svg"---- fdat :: FigureData Double-fdat = FigureData xPlot yPlot 0.1 0.8 0.1 0.9 10--palette0 = palette [C.blue, C.white, C.red] 15----- main :: IO ()--- main = do--- dat <- T.readFile fname--- let pd = A.parseOnly (gridNum space) dat--- case pd of Left e -> error e--- Right d -> do--- let pixels = heatmap fdat palette0 d--- svg_t = svgHeader xPlot yPlot pixels--- -- putStrLn $ renderSvg svg_t--- T.writeFile fnameOut $ T.pack $ renderSvg svg_t - - ---main = do- let - p1 = Point (-2) (-2)- p2 = Point 2 2- frame = mkFrame p1 p2- nx = 50- ny = 50- f x y = cos ( pi * theta ) * sin r - where- r = x'**2 + y'**2- theta = atan2 y' x'- (x', y') = (fromRational x, fromRational y)- lps = plotFun2 f $ meshGrid frame nx ny- vmin = minimum $ _lplabel <$> lps- vmax = maximum $ _lplabel <$> lps - pixels = heatmap' fdat palette0 frame (fromIntegral nx) (fromIntegral ny) lps- cbar = colourBar fdat palette0 10 vmin vmax 10 TopRight 100- svg_t = svgHeader xPlot yPlot $ do- axes fdat frame 2 C.black 10 10- pixels- cbar- T.writeFile "data/heatmap-3.svg" $ T.pack $ renderSvg svg_t- - ---- withMeshGrid :: (RealFrac a, Enum a) =>--- Point a -> Point a -> a -> a -> (Frame a -> [Point a] -> t) -> t--- withMeshGrid p1 p2 nx ny f =--- withFrame p1 p2 $ \fr -> let--- grid = meshGrid fr nx ny in f fr grid ---- withFrame p1 p2 f = f frame where--- frame = mkFrame p1 p2------- parsers---- | Parse a row of numbers, separated by `sep`-rowNums :: A.Parser s -> A.Parser [Scientific]-rowNums = A.sepBy A.scientific--rowNumSpace :: A.Parser [Scientific]-rowNumSpace = rowNums space---- | parse a grid of numbers, separated by `sep`-gridNum :: A.Parser s -> A.Parser [[Scientific]]-gridNum sep = A.sepBy (rowNums sep) A.endOfLine
− app/scatter/Main.hs
@@ -1,47 +0,0 @@-module Main where--import Control.Monad (forM_)--import qualified Data.Colour as C-import qualified Data.Colour.Names as C-import Data.Scientific (Scientific, toRealFloat)-import qualified Data.Text as T -import qualified Data.Text.IO as T (readFile, writeFile)-import Text.Blaze.Svg.Renderer.String (renderSvg)--import Graphics.Rendering.Plot.Light-import Graphics.Rendering.Plot.Light.PlotTypes--xPlot = 400-yPlot = 300-fnameOut = "data/scatter-1.svg"--fdat = FigureData xPlot yPlot 0.1 0.8 0.1 0.9 10--dats = zipWith LabeledPoint p_ l_ where- l_ = [-5, -4 .. ]- p_ = zipWith Point [4,7,12,23,90,34,24,5,6,12,3] [43,23,1,23,8,11,17,25,4,5]--spdata = ScatterPointData Circle 3 3 C.red---main = do- let- frameTo = frameFromFigData fdat- frameFrom = frameFromPoints $ _lp <$> dats- vmin = minimum $ _lplabel <$> dats- vmax = maximum $ _lplabel <$> dats - f l sz = 10/(1 + exp(-(0.3 * x)))- where x = l + sz- g _ w = w- h l col = C.blend l' C.blue col- where- l' = (l - vmin)/(vmax - vmin)- dats' = moveLabeledPointBwFrames frameFrom frameTo False True <$> dats- svg_t = svgHeader xPlot yPlot $ do- axes fdat frameFrom 2 C.black 10 10- scatterLP f g h spdata dats'- scatterLPBar fdat 50 vmin vmax 3 TopRight 100 f g h spdata- -- putStrLn $ renderSvg svg_t- T.writeFile fnameOut $ T.pack $ renderSvg svg_t-
− app/timeseries/Main.hs
@@ -1,93 +0,0 @@-{-# language OverloadedStrings #-}-module Main where---- import Control.Arrow ((***), (&&&))--import Graphics.Rendering.Plot.Light-import Graphics.Rendering.Plot.Light.PlotTypes- -import qualified Data.Attoparsec.Text as A-import qualified Attoparsec.Time.Text as AT-import qualified Data.Text as T -import qualified Data.Text.IO as T (readFile, writeFile)-import Data.Scientific (Scientific, toRealFloat)-import Text.Blaze.Svg.Renderer.String (renderSvg)-import qualified Data.Colour.Names as C--import Control.Applicative ((<|>))-import Data.Time (Day, TimeOfDay)--fname = "data/forex"--xPlot = 400-yPlot = 300-fnameOut = "data/forex_plot_5.svg"--fdat = FigureData xPlot yPlot 0.1 0.9 0.1 0.85 10---main = do- dat <- T.readFile fname- let pd = A.parseOnly parseFxDataset dat- case pd of Left e -> error e- Right d -> - do- let- lps = tspToLP fhi (\_ x -> x) <$> d- -- figure = tsAxis fdat fop fcl fhi flo 1 C.black (-45) Nothing Nothing lps - figure = tsAxis' fdat flo fhi C.magenta lps- svg_t = svgHeader xPlot yPlot figure- -- putStrLn $ renderSvg svg_t- T.writeFile fnameOut $ T.pack $ renderSvg svg_t- where- fhi = toFloat . rateHigh- flo = toFloat . rateLow- fop = toFloat . rateOpen- fcl = toFloat . rateClose-----avgTs :: FxRow Scientific -> Float-avgTs x = 0.5 * (h + l) where- h = toFloat (rateHigh x)- l = toFloat (rateLow x)-------- Forex time series parsers - related------------ * Forex dataset--parseFxDataset :: A.Parser [TsPoint (FxRow Scientific)]-parseFxDataset = A.sepBy parseFxRow A.endOfLine--parseFxRow :: A.Parser (TsPoint (FxRow Scientific))-parseFxRow = do- (d, t) <- parseDateTime- _ <- comma- open <- A.scientific- _ <- comma- hi <- A.scientific- _ <- comma- lo <- A.scientific- _ <- comma- close <- A.scientific- pure $ Tsp (Tick d t) (FxRow open hi lo close)--parseDateTime :: A.Parser (Day, TimeOfDay)-parseDateTime = do- d <- AT.dayInISO8601- _ <- space- t <- AT.timeOfDayInISO8601- return (d, t)
− data/forex
@@ -1,174 +0,0 @@-2017-06-26 21:00:00,1.0876,1.0880,1.0872,1.0874-2017-06-26 20:00:00,1.0873,1.0875,1.0872,1.0875-2017-06-26 19:00:00,1.0874,1.0875,1.0873,1.0874-2017-06-26 18:00:00,1.0870,1.0875,1.0870,1.0875-2017-06-26 17:00:00,1.0873,1.0873,1.0870,1.0870-2017-06-26 16:00:00,1.0869,1.0873,1.0867,1.0873-2017-06-26 15:00:00,1.0873,1.0876,1.0869,1.0870-2017-06-26 14:00:00,1.0875,1.0877,1.0871,1.0873-2017-06-26 13:00:00,1.0882,1.0883,1.0875,1.0875-2017-06-26 12:00:00,1.0882,1.0888,1.0880,1.0885-2017-06-26 11:00:00,1.0881,1.0882,1.0879,1.0881-2017-06-26 10:00:00,1.0881,1.0883,1.0879,1.0881-2017-06-26 09:00:00,1.0864,1.0879,1.0862,1.0879-2017-06-26 08:00:00,1.0858,1.0866,1.0858,1.0862-2017-06-26 07:00:00,1.0860,1.0862,1.0857,1.0860-2017-06-26 06:00:00,1.0855,1.0859,1.0854,1.0859-2017-06-26 05:00:00,1.0857,1.0859,1.0856,1.0856-2017-06-26 04:00:00,1.0858,1.0859,1.0857,1.0857-2017-06-26 03:00:00,1.0855,1.0859,1.0855,1.0858-2017-06-26 02:00:00,1.0856,1.0857,1.0855,1.0855-2017-06-26 01:00:00,1.0855,1.0858,1.0855,1.0856-2017-06-26 00:00:00,1.0856,1.0856,1.0855,1.0856-2017-06-25 23:00:00,1.0855,1.0856,1.0854,1.0855-2017-06-25 22:00:00,1.0855,1.0857,1.0851,1.0855-2017-06-25 21:00:00,1.0859,1.0863,1.0851,1.0855-2017-06-23 20:00:00,1.0855,1.0858,1.0852,1.0852-2017-06-23 19:00:00,1.0852,1.0855,1.0851,1.0855-2017-06-23 18:00:00,1.0854,1.0856,1.0852,1.0852-2017-06-23 17:00:00,1.0856,1.0856,1.0852,1.0854-2017-06-23 16:00:00,1.0853,1.0854,1.0851,1.0854-2017-06-23 15:00:00,1.0850,1.0853,1.0849,1.0853-2017-06-23 14:00:00,1.0852,1.0853,1.0847,1.0848-2017-06-23 13:00:00,1.0856,1.0859,1.0849,1.0849-2017-06-23 12:00:00,1.0856,1.0856,1.0851,1.0854-2017-06-23 11:00:00,1.0848,1.0856,1.0848,1.0856-2017-06-23 10:00:00,1.0854,1.0855,1.0845,1.0848-2017-06-23 09:00:00,1.0842,1.0852,1.0841,1.0852-2017-06-23 08:00:00,1.0844,1.0844,1.0837,1.0843-2017-06-23 07:00:00,1.0842,1.0848,1.0840,1.0845-2017-06-23 06:00:00,1.0838,1.0845,1.0838,1.0842-2017-06-23 05:00:00,1.0837,1.0839,1.0837,1.0838-2017-06-23 04:00:00,1.0837,1.0838,1.0836,1.0837-2017-06-23 03:00:00,1.0837,1.0837,1.0836,1.0836-2017-06-23 02:00:00,1.0838,1.0838,1.0835,1.0836-2017-06-23 01:00:00,1.0837,1.0839,1.0836,1.0837-2017-06-23 00:00:00,1.0837,1.0838,1.0835,1.0837-2017-06-22 23:00:00,1.0838,1.0838,1.0836,1.0837-2017-06-22 22:00:00,1.0839,1.0843,1.0837,1.0838-2017-06-22 21:00:00,1.0838,1.0856,1.0837,1.0838-2017-06-22 20:00:00,1.0838,1.0839,1.0837,1.0838-2017-06-22 19:00:00,1.0842,1.0842,1.0836,1.0837-2017-06-22 18:00:00,1.0841,1.0843,1.0840,1.0841-2017-06-22 17:00:00,1.0845,1.0847,1.0840,1.0841-2017-06-22 16:00:00,1.0847,1.0848,1.0843,1.0845-2017-06-22 15:00:00,1.0848,1.0851,1.0843,1.0845-2017-06-22 14:00:00,1.0852,1.0858,1.0844,1.0850-2017-06-22 13:00:00,1.0860,1.0864,1.0851,1.0851-2017-06-22 12:00:00,1.0873,1.0873,1.0862,1.0862-2017-06-22 11:00:00,1.0869,1.0873,1.0868,1.0871-2017-06-22 10:00:00,1.0871,1.0874,1.0869,1.0870-2017-06-22 09:00:00,1.0870,1.0871,1.0866,1.0870-2017-06-22 08:00:00,1.0861,1.0870,1.0860,1.0869-2017-06-22 07:00:00,1.0857,1.0862,1.0855,1.0861-2017-06-22 06:00:00,1.0863,1.0864,1.0857,1.0857-2017-06-22 05:00:00,1.0863,1.0864,1.0862,1.0863-2017-06-22 04:00:00,1.0863,1.0864,1.0861,1.0863-2017-06-22 03:00:00,1.0860,1.0863,1.0860,1.0863-2017-06-22 02:00:00,1.0862,1.0862,1.0859,1.0860-2017-06-22 01:00:00,1.0859,1.0863,1.0859,1.0863-2017-06-22 00:00:00,1.0861,1.0863,1.0860,1.0860-2017-06-21 23:00:00,1.0861,1.0862,1.0860,1.0861-2017-06-21 22:00:00,1.0861,1.0862,1.0860,1.0861-2017-06-21 21:00:00,1.0862,1.0866,1.0860,1.0861-2017-06-21 20:00:00,1.0861,1.0862,1.0859,1.0861-2017-06-21 19:00:00,1.0862,1.0862,1.0860,1.0860-2017-06-21 18:00:00,1.0860,1.0862,1.0860,1.0861-2017-06-21 17:00:00,1.0858,1.0861,1.0855,1.0859-2017-06-21 16:00:00,1.0860,1.0862,1.0858,1.0858-2017-06-21 15:00:00,1.0864,1.0864,1.0858,1.0858-2017-06-21 14:00:00,1.0859,1.0866,1.0858,1.0865-2017-06-21 13:00:00,1.0859,1.0861,1.0854,1.0856-2017-06-21 12:00:00,1.0860,1.0862,1.0858,1.0860-2017-06-21 11:00:00,1.0864,1.0865,1.0856,1.0860-2017-06-21 10:00:00,1.0855,1.0863,1.0855,1.0863-2017-06-21 09:00:00,1.0855,1.0858,1.0854,1.0854-2017-06-21 08:00:00,1.0848,1.0854,1.0846,1.0854-2017-06-21 07:00:00,1.0852,1.0853,1.0848,1.0850-2017-06-21 06:00:00,1.0852,1.0853,1.0849,1.0851-2017-06-21 05:00:00,1.0851,1.0852,1.0851,1.0851-2017-06-21 04:00:00,1.0851,1.0852,1.0850,1.0851-2017-06-21 03:00:00,1.0851,1.0853,1.0851,1.0852-2017-06-21 02:00:00,1.0855,1.0855,1.0849,1.0851-2017-06-21 01:00:00,1.0854,1.0855,1.0853,1.0855-2017-06-21 00:00:00,1.0856,1.0856,1.0850,1.0852-2017-06-20 23:00:00,1.0856,1.0857,1.0855,1.0856-2017-06-20 22:00:00,1.0866,1.0871,1.0856,1.0856-2017-06-20 21:00:00,1.0858,1.0870,1.0856,1.0861-2017-06-20 20:00:00,1.0855,1.0858,1.0855,1.0858-2017-06-20 19:00:00,1.0855,1.0857,1.0854,1.0855-2017-06-20 18:00:00,1.0857,1.0858,1.0855,1.0855-2017-06-20 17:00:00,1.0857,1.0859,1.0856,1.0858-2017-06-20 16:00:00,1.0858,1.0861,1.0857,1.0858-2017-06-20 15:00:00,1.0860,1.0862,1.0858,1.0860-2017-06-20 14:00:00,1.0859,1.0861,1.0857,1.0859-2017-06-20 13:00:00,1.0864,1.0865,1.0858,1.0859-2017-06-20 12:00:00,1.0854,1.0867,1.0854,1.0865-2017-06-20 11:00:00,1.0864,1.0864,1.0854,1.0855-2017-06-20 10:00:00,1.0861,1.0865,1.0860,1.0865-2017-06-20 09:00:00,1.0871,1.0875,1.0857,1.0864-2017-06-20 08:00:00,1.0874,1.0877,1.0868,1.0870-2017-06-20 07:00:00,1.0879,1.0880,1.0864,1.0872-2017-06-20 06:00:00,1.0878,1.0881,1.0877,1.0880-2017-06-20 05:00:00,1.0881,1.0882,1.0877,1.0877-2017-06-20 04:00:00,1.0879,1.0882,1.0878,1.0880-2017-06-20 03:00:00,1.0880,1.0881,1.0879,1.0879-2017-06-20 02:00:00,1.0880,1.0881,1.0878,1.0880-2017-06-20 01:00:00,1.0879,1.0880,1.0878,1.0880-2017-06-20 00:00:00,1.0880,1.0881,1.0878,1.0878-2017-06-19 23:00:00,1.0880,1.0880,1.0877,1.0880-2017-06-19 22:00:00,1.0882,1.0883,1.0879,1.0879-2017-06-19 21:00:00,1.0878,1.0890,1.0875,1.0882-2017-06-19 20:00:00,1.0878,1.0879,1.0877,1.0878-2017-06-19 19:00:00,1.0879,1.0879,1.0877,1.0879-2017-06-19 18:00:00,1.0879,1.0879,1.0876,1.0877-2017-06-19 17:00:00,1.0875,1.0879,1.0875,1.0878-2017-06-19 16:00:00,1.0877,1.0879,1.0875,1.0876-2017-06-19 15:00:00,1.0877,1.0879,1.0873,1.0877-2017-06-19 14:00:00,1.0883,1.0883,1.0877,1.0881-2017-06-19 13:00:00,1.0877,1.0885,1.0875,1.0885-2017-06-19 12:00:00,1.0869,1.0882,1.0868,1.0882-2017-06-19 11:00:00,1.0879,1.0880,1.0869,1.0870-2017-06-19 10:00:00,1.0876,1.0880,1.0873,1.0878-2017-06-19 09:00:00,1.0880,1.0881,1.0875,1.0876-2017-06-19 08:00:00,1.0883,1.0885,1.0877,1.0881-2017-06-19 07:00:00,1.0903,1.0903,1.0889,1.0890-2017-06-19 06:00:00,1.0905,1.0910,1.0904,1.0905-2017-06-19 05:00:00,1.0905,1.0905,1.0903,1.0904-2017-06-19 04:00:00,1.0902,1.0906,1.0902,1.0905-2017-06-19 03:00:00,1.0903,1.0903,1.0901,1.0902-2017-06-19 02:00:00,1.0904,1.0905,1.0902,1.0903-2017-06-19 01:00:00,1.0903,1.0905,1.0903,1.0904-2017-06-19 00:00:00,1.0906,1.0906,1.0902,1.0902-2017-06-18 23:00:00,1.0905,1.0905,1.0902,1.0905-2017-06-18 22:00:00,1.0903,1.0905,1.0901,1.0905-2017-06-18 21:00:00,1.0911,1.0911,1.0902,1.0907-2017-06-16 20:00:00,1.0900,1.0907,1.0898,1.0906-2017-06-16 19:00:00,1.0901,1.0902,1.0898,1.0900-2017-06-16 18:00:00,1.0904,1.0904,1.0900,1.0902-2017-06-16 17:00:00,1.0901,1.0902,1.0899,1.0901-2017-06-16 16:00:00,1.0902,1.0902,1.0898,1.0901-2017-06-16 15:00:00,1.0898,1.0902,1.0893,1.0901-2017-06-16 14:00:00,1.0890,1.0898,1.0886,1.0898-2017-06-16 13:00:00,1.0886,1.0888,1.0883,1.0884-2017-06-16 12:00:00,1.0885,1.0891,1.0884,1.0886-2017-06-16 11:00:00,1.0889,1.0890,1.0885,1.0885-2017-06-16 10:00:00,1.0881,1.0893,1.0881,1.0890-2017-06-16 09:00:00,1.0882,1.0883,1.0877,1.0882-2017-06-16 08:00:00,1.0876,1.0882,1.0876,1.0882-2017-06-16 07:00:00,1.0871,1.0876,1.0869,1.0875-2017-06-16 06:00:00,1.0870,1.0874,1.0867,1.0874-2017-06-16 05:00:00,1.0871,1.0872,1.0869,1.0870-2017-06-16 04:00:00,1.0871,1.0872,1.0870,1.0870-2017-06-16 03:00:00,1.0871,1.0872,1.0870,1.0871-2017-06-16 02:00:00,1.0872,1.0872,1.0869,1.0871-2017-06-16 01:00:00,1.0872,1.0873,1.0870,1.0872-2017-06-16 00:00:00,1.0874,1.0874,1.0871,1.0872-2017-06-15 23:00:00,1.0872,1.0873,1.0871,1.0872-2017-06-15 22:00:00,1.0875,1.0875,1.0871,1.0872-2017-06-15 21:00:00,1.0873,1.0876,1.0871,1.0875-2017-06-15 20:00:00,1.0874,1.0875,1.0871,1.0873-2017-06-15 19:00:00,1.0875,1.0875,1.0873,1.0873-2017-06-15 18:00:00,1.0874,1.0875,1.0873,1.0874-2017-06-15 17:00:00,1.0872,1.0874,1.0871,1.0872-2017-06-15 16:00:00,1.0873,1.0874,1.0871,1.0871
− data/heatmap-bw
@@ -1,6 +0,0 @@-6 5 4 3 1 0-3 2 2 0 0 1-0 0 0 0 1 0-0 0 0 0 2 3-0 0 1 2 4 3-0 1 2 3 4 5
plot-light.cabal view
@@ -1,24 +1,23 @@ name: plot-light-version: 0.2.9+version: 0.3 synopsis: A lightweight plotting library, exporting to SVG-description: This library provides drawing and plotting datastructures and functions; it is aimed in particular at scientific visualization, but it also exposes its plotting primitives and a general purpose 2D geometry library.+description: This library provides drawing and plotting datastructures and functions; it is aimed in particular at scientific visualization, but it also exposes its plotting primitives and a small but general purpose 2D geometry library.+ homepage: https://github.com/ocramz/plot-light license: BSD3 license-file: LICENSE author: Marco Zocca maintainer: zocca marco gmail-copyright: 2017 Marco Zocca+copyright: 2017-2018 Marco Zocca category: Graphics build-type: Simple extra-source-files: README.md CHANGELOG.md extra-doc-files: doc/fig/*.png cabal-version: >=1.18-tested-with: GHC == 8.0.2-data-dir: data-data-files: forex- heatmap-bw+tested-with: GHC == 8.0.2, GHC == 8.4.1 + library default-language: Haskell2010 ghc-options: -Wall -Wno-missing-signatures -Wno-type-defaults -Wno-name-shadowing@@ -36,65 +35,21 @@ Graphics.Rendering.Plot.Light.Internal.Geometry Graphics.Rendering.Plot.Light.Internal.Utils Data.Parsers- build-depends: attoparsec- , base >= 4.7 && < 5+ build-depends: base >= 4.7 && < 5 , blaze-svg , colour , containers >= 0.5.7.1 , mtl- , palette , scientific , text , time , data-default- -- * DEBUG- , hspec - , QuickCheck+ -- -- * DEBUG+ -- , hspec + -- , QuickCheck -executable scatter- default-language: Haskell2010- ghc-options: -threaded -rtsopts -with-rtsopts=-N- hs-source-dirs: app/scatter- main-is: Main.hs- build-depends: base- , plot-light- , attoparsec- , text- , colour- , blaze-svg- , scientific- -executable timeseries- default-language: Haskell2010- ghc-options: -threaded -rtsopts -with-rtsopts=-N- hs-source-dirs: app/timeseries- main-is: Main.hs- build-depends: base- , plot-light- , attoparsec- , attoparsec-time >= 1- , time- , text- , colour- , blaze-svg- , scientific--executable heatmap- default-language: Haskell2010- ghc-options: -threaded -rtsopts -with-rtsopts=-N- hs-source-dirs: app/heatmap- main-is: Main.hs- build-depends: base- , plot-light- , attoparsec- , time- , text- , colour- , palette- , blaze-svg- , scientific -+ test-suite spec default-language: Haskell2010 ghc-options: -Wall
src/Data/Parsers.hs view
@@ -1,6 +1,6 @@ module Data.Parsers where-import qualified Data.Attoparsec.Text as A+-- import qualified Data.Attoparsec.Text as A -space, comma :: A.Parser Char-space = A.char ' '-comma = A.char ','+-- space, comma :: A.Parser Char+-- space = A.char ' '+-- comma = A.char ','
src/Data/TimeSeries.hs view
@@ -32,16 +32,24 @@ -- | Map a rational onto a Tick toTick :: Rational -> Tick-toTick n = Tick d t where- t = dayFractionToTimeOfDay dec- d = ModifiedJulianDay wh- (wh, dec) = wholeDecimal n+toTick n = Tick d t+ where+ t = dayFractionToTimeOfDay dec+ d = ModifiedJulianDay wh+ (wh, dec) = wholeDecimal n -hourTick, halfHourTick, quarterHourTick :: Double+hourTick, halfHourTick, quarterHourTick :: Rational hourTick = 1/24 halfHourTick = 1/2 * hourTick quarterHourTick = 1/4 * hourTick+++-- locTime :: IO LocalTime+-- locTime = do+-- tz <- getCurrentTimeZone+-- ct <- getCurrentTime+-- return $ utcToLocalTime tz ct
src/Graphics/Rendering/Plot/Light/Internal/Geometry.hs view
@@ -26,16 +26,31 @@ mkPoint :: a -> a -> Point a mkPoint = Point --- | A binary operation on the components of two `Point`s+-- | A binary operation on the components of two 'Point's lift2Point :: (a -> b -> c) -> Point a -> Point b -> Point c lift2Point f (Point a b) (Point c d) = Point (f a c) (f b d) +-- | A unary operation on the components of a 'Point'+lift1Point :: (a -> a -> b) -> Point a -> b+lift1Point f (Point x y) = f x y+ pointInf, pointSup :: (Ord a) => Point a -> Point a -> Point a pointInf = lift2Point min pointSup = lift2Point max +-- | The origin of the axes, point (0, 0)+origin :: Num a => Point a+origin = Point 0 0 +-- | The (1, 1) point+oneOne :: Num a => Point a+oneOne = Point 1 1 +-- | Cartesian distance from the origin+norm2fromOrigin :: Floating a => Point a -> a+norm2fromOrigin p = norm2 $ p -. origin++ -- | Overwrite either coordinate of a Point, to e.g. project on an axis setPointCoord :: Axis -> a -> Point a -> Point a setPointCoord axis c (Point x y)@@ -90,7 +105,13 @@ mkFrameOrigin :: Num a => a -> a -> Frame a mkFrameOrigin w h = Frame origin (Point w h) +-- | The unit square (0, 0) - (1, 1)+unitFrame :: Num a => Frame a+unitFrame = mkFrame origin oneOne +++ -- | Create a `Frame` from a container of `Point`s `P`, i.e. construct two points `p1` and `p2` such that : -- -- p1 := inf(x,y) P@@ -124,6 +145,42 @@ ++-- | Interpolation++interpolateBilinear :: Fractional a => Frame a -> Point a -> (Point a -> a) -> a+interpolateBilinear (Frame q11@(Point x1 y1) q22@(Point x2 y2)) (Point x y) f =+ let+ q12 = Point x1 y2+ q21 = Point x2 y1+ fq11 = f q11+ fq22 = f q22+ fq12 = f q12+ fq21 = f q21+ den1 = (x1 - x2) * (y1 - y2)+ den2 = (x1 - x2) * (y2 - y1)+ c111 = fq11/den1+ c112 = fq11/den2+ c121 = fq12/den1+ c122 = fq12/den2+ c211 = fq21/den1+ c212 = fq21/den2+ c221 = fq22/den1+ c222 = fq22/den2+ a0 = c111 * x2 * y2 + c122 * x2 * y1 + c212 * x1 * y2 + c221 * x1 * y1+ a1 = c112 * y2 + c121 * y1 + c211 * y2 + c222 * y1+ a2 = c112 * x2 + c121 * x2 + c211 * x1 + c222 * x1+ a3 = c111 + c122 + c212 + c221+ in a0 + a1 * x + a2 * y + a3 * x * y+++++++++ -- * Axis data Axis = X | Y deriving (Eq, Show)@@ -204,11 +261,9 @@ v2fromEndpoints (Point px py) (Point qx qy) = V2 (qx-px) (qy-py) (-.) = v2fromEndpoints --- | The origin of the axes, point (0, 0)-origin :: Num a => Point a-origin = Point 0 0 + -- | A Mat2 can be seen as a linear operator that acts on points in the plane data Mat2 a = Mat2 a a a a deriving (Eq, Show) @@ -295,6 +350,10 @@ ++++ -- | A list of `nx` by `ny` points in the plane arranged on the vertices of a rectangular mesh. -- -- NB: Only the minimum x, y coordinate point is included in the output mesh. This is intentional, since the output from this can be used as an input to functions that use a corner rather than the center point as refernce (e.g. `rect`)@@ -439,6 +498,12 @@ instance Eps (V2 Float) where v1 ~= v2 = norm2 (v1 ^-^ v2) <= 1e-2++++++
src/Graphics/Rendering/Plot/Light/PlotTypes/Heatmap.hs view
@@ -13,7 +13,7 @@ import qualified Data.Colour as C import qualified Data.Colour.Names as C-import Data.Colour.Palette.BrewerSet+-- import Data.Colour.Palette.BrewerSet -- import Text.Blaze.Svg
src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs view
@@ -5,7 +5,7 @@ import Control.Monad (forM_) import Text.Blaze.Svg import qualified Data.Colour as C-import qualified Data.Colour.Palette.BrewerSet as CP+-- import qualified Data.Colour.Palette.BrewerSet as CP import qualified Data.Colour.Names as C
src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs view
@@ -8,7 +8,7 @@ import Control.Monad (forM_) import Text.Blaze.Svg import qualified Data.Colour as C-import qualified Data.Colour.Palette.BrewerSet as CP+-- import qualified Data.Colour.Palette.BrewerSet as CP import qualified Data.Colour.Names as C import qualified Data.Text as T @@ -123,9 +123,9 @@ glyph w sw Plus _ fcol p = plusGlyph w sw (fromMaybe C.black fcol) p --- | Utility function for cycling glyph colours and shapes (i.e. unique combinations of these make it easy to tell different datasets apart)-cycleGlyphCols :: (CP.ColorCat, Int) -> Int -> [(CP.Kolor, GlyphShape_)]-cycleGlyphCols (pal, n) nsets = take nsets $ zip (cycle $ CP.brewerSet pal n ) (cycle [Square, Circle ..])+-- -- | Utility function for cycling glyph colours and shapes (i.e. unique combinations of these make it easy to tell different datasets apart)+-- cycleGlyphCols :: (CP.ColorCat, Int) -> Int -> [(CP.Kolor, GlyphShape_)]+-- cycleGlyphCols (pal, n) nsets = take nsets $ zip (cycle $ CP.brewerSet pal n ) (cycle [Square, Circle ..])