hvega-0.10.0.0: tests/ConfigTests.hs
{-# LANGUAGE OverloadedStrings #-}
--
-- Based on the Elm VegaLite ConfigTests.elm as of version 1.12.0
--
-- - Padding has been removed as the resulting spec does not validate
-- against v3.3.0
--
module ConfigTests (testSpecs) where
import Data.Function ((&))
import Graphics.Vega.VegaLite
import Prelude hiding (filter)
testSpecs :: [(String, VegaLite)]
testSpecs = [ ("default", defaultCfg)
, ("dark", darkCfg)
, ("mark1", markCfg1)
, ("mark2", markCfg2)
, ("padding", paddingCfg)
, ("paddingx", paddingXCfg)
, ("paddingy", paddingYCfg)
, ("paddingContent", paddingCntCfg)
, ("paddingNone", paddingNoneCfg)
, ("paddingPad", paddingPadCfg)
, ("paddingPadding", paddingPaddingCfg)
, ("paddingResize", paddingResizeCfg)
, ("vbTest", vbTest)
, ("axisCfg1", axisCfg1)
, ("fontCfg", fontCfg)
, ("titleCfg1", titleCfg1)
, ("titleCfg2", titleCfg2)
, ("titleCfg3", titleCfg3)
, ("breaklinecfg", breakLineCfg)
, ("headerlabels", headerlabels)
]
carData :: Data
carData = dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" []
xHorse, yMPG :: BuildEncodingSpecs
xHorse = position X [ PName "Horsepower", PmType Quantitative ]
yMPG = position Y [ PName "Miles_per_Gallon", PmType Quantitative ]
yCount :: [PositionChannel] -> BuildEncodingSpecs
yCount opts = position Y ([ PAggregate Count, PmType Quantitative ] ++ opts)
mCylinders, mOrigin :: [MarkChannel]
mCylinders = [ MName "Cylinders", MmType Ordinal ]
mOrigin = [ MName "Origin", MmType Nominal ]
singleVis :: ([a] -> (VLProperty, VLSpec)) -> VegaLite
singleVis config =
let scatterEnc =
encoding
. xHorse
. yMPG
. color mCylinders
. shape mOrigin
in toVegaLite [ title "Car Scatter" [], config [], carData, width 200, height 200, mark Point [ MSize 100 ], scatterEnc [] ]
{- TODO: padding causes spec to be invalid -}
compositeVis :: ([a] -> (VLProperty, VLSpec)) -> VegaLite
compositeVis config =
let scatterEnc =
encoding
. xHorse
. yMPG
. color mCylinders
. shape mOrigin
scatterSpec =
asSpec [ title "Car Scatter" [], width 200, height 200
{- , padding (PSize 20) -}
, mark Point [ MSize 100 ], scatterEnc [] ]
barEnc =
encoding
. xHorse
. yCount []
. color mOrigin
streamEnc =
encoding
. position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
. yCount [ PStack StCenter, PAxis [] ]
. color mOrigin
barSpec =
asSpec [ title "Car Histogram" [], width 200, height 200
{- , padding (PSize 20) -}
, mark Bar [], barEnc [] ]
streamSpec =
asSpec [ title "Car Streamgraph" [], width 200, height 200
{- , padding (PSize 20) -}
, mark Area [], streamEnc [] ]
res =
resolve
. resolution (RScale [ ( ChColor, Independent ), ( ChShape, Independent ) ])
in
toVegaLite [ config [], carData, hConcat [ scatterSpec, barSpec, streamSpec ], res [] ]
vbTest :: VegaLite
vbTest =
let scatterEnc =
encoding
. xHorse
. yMPG
. color mCylinders
. shape mOrigin
barEnc =
encoding
. xHorse
. yCount []
. color mOrigin
streamEnc =
encoding
. position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
. yCount [ PStack StCenter, PAxis [] ]
. color mOrigin
scatterSpec =
asSpec
[ title "Car Scatter" [TColor "brown", TFontSize 12]
, width 200
, height 200
, mark Point [ MSize 100 ]
, scatterEnc []
]
barSpec =
asSpec
[ title "Car Histogram" []
, width 200
, height 200
, viewBackground
[ VBFill "white"
, VBCornerRadius 18
, VBStroke "red"
, VBStrokeWidth 4
, VBStrokeCap CRound
, VBStrokeDash [ 10, 10 ]
, VBStrokeJoin JBevel
]
, mark Bar []
, barEnc []
]
cfg =
configure
. configuration
(MarkNamedStyles
[ ( "myStyle", [ MFill "red", MFillOpacity 0.1, MStrokeOpacity 1 ] )
, ( "mySecondStyle", [ MFill "black", MStroke "blue" ] )
]
)
. configuration (ViewStyle [ ViewBackgroundStyle [ VBFill "#feb" ] ])
. configuration (LegendStyle [ LeNoTitle ])
streamSpec =
asSpec
[ title "Car Streamgraph" []
, width 200
, height 200
, viewBackground [ VBStyle [ "myStyle", "mySecondStyle" ] ]
, mark Area []
, streamEnc []
]
res =
resolve
. resolution (RScale [ ( ChColor, Independent ), ( ChShape, Independent ) ])
in
toVegaLite
[ cfg []
, background "yellow"
, carData
, hConcat [ scatterSpec, barSpec, streamSpec ]
, res []
]
defaultCfg :: VegaLite
defaultCfg =
configure
& compositeVis
darkCfg :: VegaLite
darkCfg =
configure
. configuration (BackgroundStyle "black")
. configuration (TitleStyle [ TFont "Roboto", TColor "#fff" ])
. configuration (Axis [ DomainColor "yellow", GridColor "rgb(255,255,200)", GridOpacity 0.2, LabelColor "#fcf", TickColor "white", TitleColor "rgb(200,255,200)", LabelFont "Roboto", TitleFont "Roboto" ])
. configuration (LegendStyle [ LeFillColor "#333", LeStrokeColor "#444", LeTitleColor "rgb(200,200,200)", LeLabelColor "white", LeSymbolFillColor "red", LeGradientStrokeColor "yellow", LeLabelFont "Roboto", LeTitleFont "Roboto"
, LeDirection Horizontal
])
& compositeVis
markCfg1 :: VegaLite
markCfg1 =
configure
. configuration (MarkStyle [ MFilled False ])
& compositeVis
markCfg2 :: VegaLite
markCfg2 =
configure
. configuration (MarkStyle [ MFilled True, MFill "black", MOpacity 1 ])
. configuration (BarStyle [ MFilled True ])
. configuration (AreaStyle [ MFilled False ])
. configuration (PointStyle [ MFilled True, MStroke "white", MStrokeOpacity 0.2 ])
& compositeVis
paddingTest :: Autosize -> VegaLite
paddingTest a =
configure
. configuration (AutosizeStyle [ a ])
. configuration (PaddingStyle (PEdges 90 60 30 0))
& singleVis
paddingCfg, paddingXCfg, paddingYCfg, paddingCntCfg, paddingNoneCfg,
paddingPadCfg, paddingPaddingCfg, paddingResizeCfg:: VegaLite
paddingCfg = paddingTest AFit
paddingXCfg = paddingTest AFitX
paddingYCfg = paddingTest AFitY
paddingCntCfg = paddingTest AContent
paddingNoneCfg = paddingTest ANone
paddingPadCfg = paddingTest APad
paddingPaddingCfg = paddingTest APadding
paddingResizeCfg = paddingTest AResize
axisCfg1 :: VegaLite
axisCfg1 =
configure
. configuration (Axis [ TitleFontStyle "italic"
, TitleFont "serif"
, LabelFontStyle "bold"
, LabelFont "serif"
, TitleAnchor AEnd
])
& singleVis
fontCfg :: VegaLite
fontCfg =
configure
. configuration (FontStyle "Comic Sans MS")
& singleVis
titleOpts :: [PropertySpec]
titleOpts =
[ carData
, width 200
, height 200
, mark Circle []
, encoding . xHorse . yMPG $ []
]
titleCfg1 :: VegaLite
titleCfg1 =
toVegaLite
(title "Car\nScatter" [ TSubtitle "A subtitle\nalso over two lines" ]
: titleOpts)
cfgOpts :: [TitleConfig]
cfgOpts =
[ TAnchor AEnd
, TSubtitleColor "red"
, TSubtitleFont "serif"
, TSubtitleFontSize 10
, TSubtitleFontStyle "italic"
, TSubtitleFontWeight W900
, TSubtitleLineHeight 18
, TSubtitlePadding 60
, TLineHeight 20
, TdX (-30)
, TdY 10
]
subtitle :: TitleConfig
subtitle = TSubtitle "A subtitle\nalso over two lines"
titleCfg2 :: VegaLite
titleCfg2 =
toVegaLite
(title "Car\nScatter" (subtitle : cfgOpts)
: titleOpts)
titleCfg3 :: VegaLite
titleCfg3 =
let cfg = configure
. configuration
(TitleStyle cfgOpts)
in toVegaLite
( [ cfg []
, title "Car\nScatter" [ subtitle ]
] ++ titleOpts )
breakLineCfg :: VegaLite
breakLineCfg =
let dvals = dataFromColumns []
. dataColumn "x" (Numbers [5, 10, 15])
. dataColumn "y" (Numbers [10, 5, 30])
. dataColumn "l" (Strings ["xXx", "x x", "xxXxXxx"])
enc = encoding
. position X [PName "x", PmType Quantitative]
. position Y [PName "y", PmType Quantitative]
. text [TName "l", TmType Nominal]
in toVegaLite [ configure (configuration (LineBreakStyle "X") [])
, dvals []
, enc []
, mark Text []
]
headerlabels :: VegaLite
headerlabels =
let conf = configure
. configuration (HeaderStyle [HLabel False])
$ []
dvals = dataFromUrl "https://vega.github.io/vega-lite/data/population.json" []
trans = transform
. filter (FExpr "datum.year === 2000")
. calculateAs "datum.sex === 2 ? 'Female' : 'Male'" "gender"
$ []
enc = encoding
. position X [PName "age", PmType Ordinal]
. position Y [PName "people", PmType Quantitative, PAggregate Sum]
. column [FName "gender", FmType Nominal]
. color [MName "gender", MmType Nominal]
$ []
in toVegaLite [conf, dvals, trans, enc, mark Bar []]