{-# LANGUAGE OverloadedStrings #-} -- -- Based on the Elm VegaLite GalleryScatter.elm (from development of version -- 1.13.0) -- module Gallery.Scatter (testSpecs) where import Graphics.Vega.VegaLite import Prelude hiding (filter, lookup, repeat) testSpecs :: [(String, VegaLite)] testSpecs = [ ("scatter1", scatter1) , ("scatter2", scatter2) , ("scatter3", scatter3) , ("scatter4", scatter4) , ("scatter5", scatter5) , ("scatter6", scatter6) , ("scatter7", scatter7) , ("scatter8", scatter8) , ("scatter9", scatter9) , ("scatter10", scatter10) , ("scatter11", scatter11) , ("smoothing1", smoothing1) , ("smoothing2", smoothing2) ] pQuant :: PositionChannel pQuant = PmType Quantitative scatter1 :: VegaLite scatter1 = let des = description "A scatterplot showing horsepower and miles per gallon for various cars (via point marks)." enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Miles_per_Gallon", PmType Quantitative ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , mark Point [ MTooltip TTData ] , enc [] ] scatter2 :: VegaLite scatter2 = let des = description "Shows the distribution of a single variable (precipitation) using tick marks." enc = encoding . position X [ PName "precipitation", PmType Quantitative ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/seattle-weather.csv" [] , mark Tick [] , enc [] ] scatter3 :: VegaLite scatter3 = let des = description "Shows the relationship between horsepower and the number of cylinders using tick marks." enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Cylinders", PmType Ordinal ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , mark Tick [] , enc [] ] scatter4 :: VegaLite scatter4 = let des = description "A scatterplot showing horsepower and miles per gallon with country of origin double encoded by colour and shape." enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Miles_per_Gallon", PmType Quantitative ] . color [ MName "Origin", MmType Nominal ] . shape [ MName "Origin", MmType Nominal ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , mark Point [] , enc [] ] scatter5 :: VegaLite scatter5 = let des = description "A binned scatterplot comparing IMDB and Rotten Tomatoes rating with marks sized by number of reviews." enc = encoding . position X [ PName "IMDB_Rating", PmType Quantitative, PBin [ MaxBins 10 ] ] . position Y [ PName "Rotten_Tomatoes_Rating", PmType Quantitative, PBin [ MaxBins 10 ] ] . size [ MAggregate Count, MmType Quantitative ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/movies.json" [] , mark Circle [] , enc [] ] scatter6 :: VegaLite scatter6 = let des = description "A bubbleplot showing horsepower on x, miles per gallons on y, and acceleration on size." enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Miles_per_Gallon", PmType Quantitative ] . size [ MName "Acceleration", MmType Quantitative ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , mark Point [] , enc [] ] scatter7 :: VegaLite scatter7 = let des = description "Scatterplot with Null values in grey" config = configure . configuration (MarkStyle [ MRemoveInvalid False ]) enc = encoding . position X [ PName "IMDB_Rating", PmType Quantitative ] . position Y [ PName "Rotten_Tomatoes_Rating", PmType Quantitative ] . color [ MDataCondition [ ( Expr "datum.IMDB_Rating === null || datum.Rotten_Tomatoes_Rating === null" , [ MString "#ddd" ] ) ] [ MString "rgb(76,120,168)" ] ] in toVegaLite [ des , config [] , dataFromUrl "https://vega.github.io/vega-lite/data/movies.json" [] , mark Point [] , enc [] ] scatter8 :: VegaLite scatter8 = let des = description "A scatterplot showing horsepower and miles per gallon for various cars (via circle marks)." enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Miles_per_Gallon", PmType Quantitative ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , mark Circle [] , enc [] ] scatter9 :: VegaLite scatter9 = let des = description "A bubble plot showing the correlation between health and income for 187 countries in the world (modified from an example in Lisa Charlotte Rost's blog post 'One Chart, Twelve Charting Libraries' --http://lisacharlotterost.github.io/2016/05/17/one-chart-code/)." enc = encoding . position X [ PName "income", PmType Quantitative, PScale [ SType ScLog ] ] . position Y [ PName "health", PmType Quantitative, PScale [ SZero False ] ] . size [ MName "population", MmType Quantitative ] . color [ MString "#000" ] sel = selection . select "view" Interval [ BindScales ] in toVegaLite [ des , width 500 , height 300 , dataFromUrl "https://vega.github.io/vega-lite/data/gapminder-health-income.csv" [] , mark Circle [] , enc [] , sel [] ] scatter10 :: VegaLite scatter10 = let des = description "Visualization of global deaths from natural disasters. Copy of chart from https://ourworldindata.org/natural-catastrophes" trans = transform . filter (FExpr "datum.Entity !== 'All natural disasters'") enc = encoding . position X [ PName "Year", PmType Ordinal, PAxis [ AxLabelAngle 0 ] ] . position Y [ PName "Entity", PmType Nominal, PAxis [ AxNoTitle ] ] . size [ MName "Deaths" , MmType Quantitative , MLegend [ LTitle "Annual Global Deaths" ] , MScale [ SRange (RNumbers [ 0, 5000 ]) ] ] . color [ MName "Entity", MmType Nominal, MLegend [] ] in toVegaLite [ des , width 600 , height 400 , dataFromUrl "https://vega.github.io/vega-lite/data/disasters.csv" [] , trans [] , mark Circle [ MOpacity 0.8, MStroke "black", MStrokeWidth 1 ] , enc [] ] scatter11 :: VegaLite scatter11 = let des = description "A scatterplot showing horsepower and miles per gallon with country of origin double encoded by colour and text symbol." trans = transform . calculateAs "datum.Origin[0]" "OriginInitial" enc = encoding . position X [ PName "Horsepower", PmType Quantitative ] . position Y [ PName "Miles_per_Gallon", PmType Quantitative ] . color [ MName "Origin", MmType Nominal ] . text [ TName "OriginInitial", TmType Nominal ] in toVegaLite [ des , dataFromUrl "https://vega.github.io/vega-lite/data/cars.json" [] , trans [] , mark Text [] , enc [] ] -- combines scatter12 and scatter13 from elm -- -- TODO: how to add a legend to indicate which line is which? -- smoothing1 :: VegaLite smoothing1 = let desc = description "How can we 'smooth' data?" dvals = dataFromUrl "https://vega.github.io/vega-lite/data/movies.json" [] ltrans = transform . loess "IMDB_Rating" "Rotten_Tomatoes_Rating" [ LsBandwidth 0.1 ] rtrans = transform . regression "IMDB_Rating" "Rotten_Tomatoes_Rating" [ RgMethod RgPoly, RgOrder 3, RgExtent 10 90 ] enc = encoding . position X [ PName "Rotten_Tomatoes_Rating", pQuant ] . position Y [ PName "IMDB_Rating", pQuant ] pointSpec = asSpec [ mark Point [ MFilled True, MOpacity 0.3 ] ] trendSpec = asSpec [ ltrans [], mark Line [ MColor "firebrick" ] ] regSpec = asSpec [ rtrans [], mark Line [ MColor "orange" ] ] layers = layer [ pointSpec, trendSpec, regSpec ] in toVegaLite [ desc, width 300, height 300, dvals, enc [], layers ] -- smoothing1 but rename the columns in the transform -- and use the default regression values -- smoothing2 :: VegaLite smoothing2 = let desc = description "How can we 'smooth' and rename data?" dvals = dataFromUrl "https://vega.github.io/vega-lite/data/movies.json" [] ltrans = transform . loess "IMDB_Rating" "Rotten_Tomatoes_Rating" [ LsAs "Rotten_Tomatoes_Rating" "ly" ] rtrans = transform . regression "IMDB_Rating" "Rotten_Tomatoes_Rating" [ RgAs "Rotten_Tomatoes_Rating" "ry" ] enc y = encoding . position X [ PName "Rotten_Tomatoes_Rating", pQuant ] . position Y [ PName y, pQuant ] pointSpec = asSpec [ enc "IMDB_Rating" [] , mark Point [ MFilled True, MOpacity 0.3 ] ] trendSpec = asSpec [ enc "ly" [] , ltrans [] , mark Line [ MColor "firebrick" ] ] regSpec = asSpec [ enc "ry" [] , rtrans [] , mark Line [ MColor "orange" ] ] layers = layer [ pointSpec, trendSpec, regSpec ] in toVegaLite [ desc, width 300, height 300, dvals, layers ]