hvega-0.11.0.0: tests/Gallery/Line.hs
{-# LANGUAGE OverloadedStrings #-}
--
-- Based on the Elm VegaLite GalleryLine.elm (from development of version
-- 1.13.0)
--
-- TODO: update to v2.0 Elm test suite
module Gallery.Line (testSpecs) where
import Graphics.Vega.VegaLite
import Prelude hiding (filter, lookup, repeat)
import Data.Function ((&))
testSpecs :: [(String, VegaLite)]
testSpecs = [ ("line1", line1)
, ("line2", line2)
, ("line3", line3)
, ("line4", line4)
, ("line5", line5)
, ("line6", line6)
, ("line7", line7)
, ("line8", line8)
, ("line9", line9)
, ("line10", line10)
, ("line11", line11)
, ("line12", line12)
, ("conditionalaxis", conditionalAxis)
, ("linecolorhalo", lineColorHalo)
]
stockData :: Data
stockData = dataFromUrl "https://vega.github.io/vega-lite/data/stocks.csv" []
goog :: [TransformSpec] -> PropertySpec
goog = transform . filter (FExpr "datum.symbol === 'GOOG'")
baseEnc :: [EncodingSpec] -> PropertySpec
baseEnc = encoding
. position X [ PName "date", PmType Temporal, PAxis [ AxFormat "%Y" ] ]
. position Y [ PName "price", PmType Quantitative ]
line1 :: VegaLite
line1 =
toVegaLite
[ description "Google's stock price over time."
, stockData
, goog []
, mark Line []
, baseEnc []
]
line2 :: VegaLite
line2 =
toVegaLite
[ description "Google's stock price over time with point markers."
, stockData
, goog []
, mark Line [ MColor "green", MPoint (PMMarker [ MColor "purple" ]) ]
, baseEnc []
]
line3 :: VegaLite
line3 =
toVegaLite
[ description "Stock prices of 5 tech companies over time."
, stockData
, mark Line []
, baseEnc (color [ MName "symbol", MmType Nominal ] [])
]
line4 :: VegaLite
line4 =
let
des =
description "Slope graph showing the change in yield for different barley sites. It shows the error in the year labels for the Morris site."
enc =
encoding
. position X [ PName "year", PmType Ordinal, PScale [ SPadding 0.5 ] ]
. position Y [ PName "yield", PmType Quantitative, PAggregate Median ]
. color [ MName "site", MmType Nominal ]
in
toVegaLite
[ des
, dataFromUrl "https://vega.github.io/vega-lite/data/barley.json" []
, mark Line []
, widthStep 50
, enc []
]
line5 :: VegaLite
line5 =
toVegaLite
[ description "Google's stock price over time (quantized as a step-chart)."
, stockData
, goog []
, mark Line [ MInterpolate StepAfter ]
, baseEnc []
]
line6 :: VegaLite
line6 =
let
des =
description "Google's stock price over time (smoothed with monotonic interpolation)."
in
toVegaLite
[ des
, stockData
, goog []
, mark Line [ MInterpolate Monotone ]
, baseEnc []
]
line7 :: VegaLite
line7 =
let
des =
description "A connected scatterplot can be created by customizing line order and adding point marker in the line mark definition."
enc =
encoding
. position X [ PName "miles", PmType Quantitative, PScale [ SZero False ] ]
. position Y [ PName "gas", PmType Quantitative, PScale [ SZero False ] ]
. order [ OName "year" ]
in
toVegaLite
[ des
, dataFromUrl "https://vega.github.io/vega-lite/data/driving.json" []
, enc []
, mark Line [ MPoint (PMMarker []) ]
]
line8 :: VegaLite
line8 =
let
des =
description "Stock prices of five tech companies over time double encoding price with vertical position and line thickness."
enc =
baseEnc
. size [ MName "price", MmType Quantitative ]
. color [ MName "symbol", MmType Nominal ]
in
toVegaLite
[ des
, stockData
, mark Trail []
, enc []
]
line9 :: VegaLite
line9 =
let
des =
description "Line chart with markers and invalid values."
dvals =
dataFromColumns []
. dataColumn "x" (Numbers [ 1, 2, 3, 4, 5, 6, 7 ])
. dataColumn "y" (Numbers [ 10, 30, 0 / 0, 15, 0 / 0, 40, 20 ])
enc =
encoding
. position X [ PName "x", PmType Quantitative ]
. position Y [ PName "y", PmType Quantitative ]
in
toVegaLite
[ des
, dvals []
, mark Line [ MPoint (PMMarker []) ]
, enc []
]
line10 :: VegaLite
line10 =
let
des =
description "Carbon dioxide in the atmosphere."
trans =
transform
. calculateAs "year(datum.Date)" "year"
. calculateAs "month(datum.Date)" "month"
. calculateAs "floor(datum.year / 10)" "decade"
. calculateAs "(datum.year % 10) + (datum.month / 12)" "scaled_date"
encPosition =
encoding
. position X
[ PName "scaled_date"
, PmType Quantitative
, PAxis [ AxTitle "Year into decade"
, AxTickCount 10
, AxValues (Numbers [1, 2, 3, 4, 5, 6, 7, 8, 9])
]
]
. position Y
[ PName "CO2"
, PmType Quantitative
, PScale [ SZero False ]
, PAxis [ AxTitle "CO2 concentration in ppm" ]
]
encLine =
encoding
. color [ MName "decade", MmType Nominal, MLegend [] ]
specLine =
asSpec [ mark Line [ MOrient Vertical ], encLine [] ]
transTextMin =
transform
. aggregate [ opAs (ArgMin Nothing) "scaled_date" "aggregated" ] [ "decade" ]
. calculateAs "datum.aggregated.scaled_date" "scaled_date"
. calculateAs "datum.aggregated.CO2" "CO2"
encTextMin =
encoding
. text [ TName "aggregated.year", TmType Nominal ]
specTextMin =
asSpec [ transTextMin [], mark Text [ MAlign AlignLeft, MBaseline AlignTop, MdX 3, MdY 1 ], encTextMin [] ]
transTextMax =
transform
. aggregate [ opAs (ArgMax Nothing) "scaled_date" "aggregated" ] [ "decade" ]
. calculateAs "datum.aggregated.scaled_date" "scaled_date"
. calculateAs "datum.aggregated.CO2" "CO2"
encTextMax =
encoding
. text [ TName "aggregated.year", TmType Nominal ]
specTextMax =
asSpec [ transTextMax [], mark Text [ MAlign AlignLeft, MBaseline AlignBottom, MdX 3, MdY 1 ], encTextMax [] ]
config =
configure . configuration (ViewStyle [ ViewNoStroke ])
in
toVegaLite
[ des
, config []
, width 800
, height 500
, dataFromUrl "https://vega.github.io/vega-lite/data/co2-concentration.csv" [ Parse [ ( "Date", FoUtc "%Y-%m-%d" ) ] ]
, trans []
, encPosition []
, layer [ specLine, specTextMin, specTextMax ]
]
line11 :: VegaLite
line11 =
let
des =
description "Line chart showing ranks over time for thw World Cup 2018 Group F teams"
dvals =
dataFromColumns []
. dataColumn "team" (Strings [ "Germany", "Mexico", "South Korea", "Sweden", "Germany", "Mexico", "South Korea", "Sweden", "Germany", "Mexico", "South Korea", "Sweden" ])
. dataColumn "matchday" (Numbers [ 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 ])
. dataColumn "point" (Numbers [ 0, 3, 0, 3, 3, 6, 0, 3, 3, 6, 3, 6 ])
. dataColumn "diff" (Numbers [ -1, 1, -1, 1, 0, 2, -2, 0, -2, -1, 0, 3 ])
trans =
transform
. window [ ( [ WOp Rank ], "rank" ) ]
[ WSort [ WDescending "point", WDescending "diff" ], WGroupBy [ "matchday" ] ]
enc =
encoding
. position X [ PName "matchday", PmType Ordinal ]
. position Y [ PName "rank", PmType Ordinal ]
. color [ MName "team", MmType Nominal, MScale teamColours ]
teamColours =
categoricalDomainMap
[ ( "Germany", "black" )
, ( "Mexico", "#127153" )
, ( "South Korea", "#c91a3c" )
, ( "Sweden", "#0c71ab" )
]
in
toVegaLite [ des, dvals [], trans [], enc [], mark Line [ MOrient Vertical ] ]
line12 :: VegaLite
line12 =
let
des =
description "Plots a function using a generated sequence"
dvals =
dataSequenceAs 0 12.7 0.1 "u"
trans =
transform
. calculateAs "sin(datum.u)" "v"
. calculateAs "cos(datum.u)" "w"
encSin =
encoding
. position X [ PName "u", PmType Quantitative, PTitle "x" ]
. position Y [ PName "v", PmType Quantitative, PTitle "sin(x)" ]
specSin =
asSpec [ encSin [], mark Line [] ]
encCos =
encoding
. position X [ PName "u", PmType Quantitative, PTitle "x" ]
. position Y [ PName "w", PmType Quantitative, PTitle "cos(x)" ]
specCos =
asSpec [ encCos [], mark Line [ MStroke "firebrick" ] ]
in
toVegaLite [ des, width 300, height 150, dvals, trans [], layer [ specSin, specCos ] ]
-- From https://vega.github.io/vega-lite/examples/line_conditional_axis.html
-- added in Vega-Lite 4.6.0
--
conditionalAxis :: VegaLite
conditionalAxis =
let enc = encoding
. position Y [PName "price", PmType Quantitative]
. position X [PName "date", PmType Temporal, PAxis axOpts]
axOpts = [ AxTickCount 8
, AxLabelAlign AlignLeft
, AxLabelExpr expr
, AxLabelOffset 4
, AxLabelPadding (-24)
, AxTickSize 30
, AxDataCondition
cond
(CAxGridDash [] [2, 2])
, AxDataCondition
cond
(CAxTickDash [] [2, 2])
]
expr = "[timeFormat(datum.value, '%b'), timeFormat(datum.value, '%m') == '01' ? timeFormat(datum.value, '%Y') : '']"
cond = FEqual "value" (Number 1)
& FilterOpTrans (MTimeUnit (TU Month))
yearRange = FRange "date" (NumberRange 2006 2007)
& FilterOpTrans (MTimeUnit (TU Year))
& FCompose
in toVegaLite [ description "Line chart with conditional axis ticks, labels, and grid."
, stockData
, goog
. filter yearRange
$ []
, width 400
, mark Line []
, enc []
, configure
. configuration (Axis [DomainColor "#ddd", TickColor "#ddd"])
$ []
]
-- https://vega.github.io/vega-lite/examples/line_color_halo.html
lineColorHalo :: VegaLite
lineColorHalo =
let desc = "Multi-series Line Chart with Halo. Use pivot and repeat-layer as a workaround to facet groups of lines and their halo strokes. See https://github.com/vega/vega-lite/issues/6192 for more discussion."
plot = [layer [asSpec plot1, asSpec plot2]]
encBase = encoding
. position X [PName "date", PmType Temporal]
. position Y [PRepeat Layer, PmType Quantitative, PTitle "price"]
plot1 = [ mark Line [MStroke "white", MStrokeWidth 4]
, encBase []
]
plot2 = [ mark Line []
, encBase
. stroke [MRepeatDatum Layer, MmType Nominal]
$ []
]
in toVegaLite [ description desc
, stockData
, transform
. pivot "symbol" "price" [PiGroupBy ["date"]]
$ []
, repeat [LayerFields ["AAPL", "AMZN", "GOOG", "IBM", "MSFT"]]
, specification (asSpec plot)
]