packages feed

tdigest-Chart-0: example/Examples.hs

{-# LANGUAGE DataKinds #-}
module Main (main) where

import Prelude ()
import Prelude.Compat
import Control.Lens   ((&), (.~))
import Control.Monad  (replicateM)
import Data.TDigest

import Statistics.Distribution            (ContGen (..))
import Statistics.Distribution.ChiSquared (chiSquared)
import Statistics.Distribution.Normal     (standard)

import qualified Graphics.Rendering.Chart.Backend.Diagrams as Chart
import qualified Graphics.Rendering.Chart.Easy             as Chart
import qualified Graphics.Rendering.Chart.Plot.TDigest     as Chart
import qualified System.Random.MWC                         as MWC

example1 :: IO ()
example1 = do
    xs <- randomStream standard
    let td = tdigest xs :: TDigest 10
    Chart.toFile Chart.def "example1.svg" $ do
        Chart.layout_title Chart..= "Normal distribution"
        Chart.plot $ do
            p <- Chart.tdigestPlot "tdigest" td
            return $ Chart.tdigestToPlot $ p
                & Chart.plot_tdigest_normalize .~ True
                & Chart.plot_tdigest_deviations .~ Just 3

example2 :: IO ()
example2 = do
    xs <- randomStream $ chiSquared 5
    let td = tdigest xs :: TDigest 10
    Chart.toFile Chart.def "example2.svg" $ do
        Chart.layout_title Chart..= "Chi-squared distribution, k = 5"
        Chart.plot $ do
            p <- Chart.tdigestPlot "tdigest" td
            return $ Chart.tdigestToPlot $ p
                & Chart.plot_tdigest_normalize .~ True
                & Chart.plot_tdigest_quantiles .~ [0.5, 0.9, 0.999]

main :: IO ()
main = do
    example1
    example2

-------------------------------------------------------------------------------
-- Helpers
-------------------------------------------------------------------------------

randomStream :: ContGen d => d -> IO [Double]
randomStream d = do
    g <- MWC.create
    replicateM 100000 (genContVar d g)