packages feed

hvega-0.4.0.0: tests/AxisTests.hs

{-# LANGUAGE OverloadedStrings #-}

--
-- Based on the Elm VegaLite AxisTests.elm in the 2.0 development version
--
module AxisTests (testSpecs) where

import qualified Data.Text as T

import Graphics.Vega.VegaLite

import Prelude hiding (filter)

testSpecs :: [(String, VegaLite)]
testSpecs = [ ("axis1", axis1)
            , ("axis2", axis2)
            , ("axis3", axis3)
            , ("axis4", axis4)
            , ("axis5", axis5)
            , ("axis6", axis6)
            -- , ("axis7", axis7)  require AxLabelExpr support (VL 4)
            -- , ("axis8", axis8)  require AxLabelExpr support (VL 4)
            , ("zorder", zorder)
            ]


-- We do not provide these in hvega, so define them here to make copying
-- the Elm tests over easier.
--
pOrdinal, pQuant, pTemporal :: PositionChannel
pOrdinal = PmType Ordinal
pQuant = PmType Quantitative
pTemporal = PmType Temporal

pName :: T.Text -> PositionChannel
pName = PName


simpleData :: [DataColumn] -> Data
simpleData =
  let xvals = map fromIntegral xs
      xs = [1::Int .. 100]
  in dataFromColumns []
       . dataColumn "x" (Numbers xvals)
       . dataColumn "catX" (Strings (map (T.pack . show) xs))
       . dataColumn "y" (Numbers xvals)


temporalData :: [DataColumn] -> Data
temporalData =
  let dates = [ "2019-01-01 09:00:00"
              , "2019-01-02 09:00:00"
              , "2019-01-03 09:00:00"
              , "2019-01-04 09:00:00"
              , "2019-01-05 09:00:00"
              , "2019-01-06 09:00:00"
              , "2019-01-07 09:00:00"
              , "2019-01-08 09:00:00"
              , "2019-01-09 09:00:00"
              , "2019-01-10 09:00:00"
              , "2019-01-11 09:00:00"
              , "2019-01-12 09:00:00"
              ]

      xs = map fromIntegral [1::Int .. 12]

  in dataFromColumns []
     . dataColumn "date" (Strings dates)
     . dataColumn "y" (Numbers xs)


axis1 :: VegaLite
axis1 =
  let enc = encoding
              . position X [ pName "x", pQuant ]
              . position Y [ pName "y", pQuant ]
    in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis2 :: VegaLite
axis2 =
  let enc = encoding
              . position X [ pName "catX", pOrdinal ]
              . position Y [ pName "y", pQuant ]
    in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis3 :: VegaLite
axis3 =
  let enc = encoding
              . position X [ pName "date", pTemporal ]
              . position Y [ pName "y", pQuant ]
    in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis4 :: VegaLite
axis4 =
  let enc = encoding
              . position X [ pName "x"
                           , pQuant
                           , PAxis [AxValues (Numbers [1, 25, 39, 90])]
                           ]
              . position Y [ pName "y", pQuant ]
    in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis5 :: VegaLite
axis5 =
  let enc = encoding
              . position X [ pName "catX"
                           , pOrdinal
                           , PAxis [AxValues (Strings ["1", "25", "39", "dummy", "90"])]
                           ]
              . position Y [ pName "y", pQuant ]
    in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis6 :: VegaLite
axis6 =
  let enc = encoding
              . position X [ pName "date"
                           , pTemporal
                           , PAxis [AxValues (DateTimes axDates)]
                           ]
              . position Y [ pName "y", pQuant ]

      axDates = [ [DTYear 2019, DTMonth Jan, DTDate 4 ]
                , [DTYear 2019, DTMonth Jan, DTDate 8 ]
                , [DTYear 2019, DTMonth Jan, DTDate 20 ]
                ]
                
  in 
    toVegaLite [ temporalData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


{-
axis7 :: VegaLite
axis7 =
  let enc = encoding
              . position X [ pName "x"
                           , pQuant
                           , PAxis [AxLabelExpr "datum.value / 100"]
                           ]
              . position Y [ pName "y", pQuant ]
  in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]


axis8 :: VegaLite
axis8 =
  let enc = encoding
              . position X [ pName "catX"
                           , pOrdinal
                           , PAxis [AxLabelExpr "'number' + datum.label"]
                           ]
              . position Y [ pName "y", pQuant ]
  in
    toVegaLite [ simpleData [], enc [], mark Line [ MPoint (PMMarker []) ] ]

-}


-- From
-- https://github.com/gicentre/elm-vegalite/issues/15#issuecomment-524527125
--
zorder :: VegaLite
zorder =
  let dcols = dataFromColumns []
              . dataColumn "x" (Numbers [ 20, 10 ])
              . dataColumn "y" (Numbers [ 10, 20 ])
              . dataColumn "cat" (Strings [ "a", "b" ])

      axis lbl z = [ PName lbl, PmType Quantitative, PAxis [ AxZIndex z ] ]
      enc = encoding
            . position X (axis "x" 2)
            . position Y (axis "y" 1)
            . color [ MName "cat", MmType Nominal, MLegend [] ]

      cfg = configure
            . configuration (Axis [ GridWidth 8 ])
            . configuration (AxisX [ GridColor "red" ])
            . configuration (AxisY [ GridColor "blue" ])

  in toVegaLite [ cfg []
                , dcols []
                , enc []
                , mark Circle [ MSize 5000, MOpacity 1 ]
                ]