HLearn-distributions-0.1.0.0: src/HLearn/Gnuplot/Distributions.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
module HLearn.Gnuplot.Distributions
where
import HLearn.Algebra
import HLearn.Models.Distributions
import qualified Data.Vector.Unboxed as VU
import Control.Monad
import System.IO
import System.Process
data PlotParams = PlotParams
{ dataFile :: FilePath
, gnuFile :: FilePath
, picFile :: FilePath
, plotPoints :: [Double]
}
class PlottableDistribution dist where
genPlotPoints :: dist -> [Double]
instance PlottableDistribution (KDE Double) where
genPlotPoints (SGJust kde) = VU.toList $ samplePoints $ params kde
genPlotParams :: (PlottableDistribution dist) => String -> dist -> PlotParams
genPlotParams str dist = PlotParams
{ dataFile = str++".dat"
, gnuFile = str++".gnu"
, picFile = str++".ps"
, plotPoints = genPlotPoints dist
}
defPlotParams = PlotParams
{ dataFile = "hlearn-distributions.dat"
, gnuFile = "hlearn-distributions.gnu"
, picFile = "hlearn-distributions.ps"
, plotPoints = [-5..5]
}
plotDistribution :: (Distribution dist Double Double) => PlotParams -> dist -> IO ()
plotDistribution params dist = do
-- Create data file
putStrLn "Creating data file..."
datah <- openFile (dataFile params) WriteMode
forM_ (plotPoints params) $ \x -> do
-- forM_ (map (/10) [-50..50]) $ \x -> do
hPutStrLn datah $ show (x::Double) ++ " " ++ show (pdf dist x::Double)
hClose datah
-- Create gnuplot file
putStrLn "Plotting data"
gnuh <- openFile (gnuFile params) WriteMode
hPutStrLn gnuh $ "set terminal postscript \"Times-Roman\" 25"
hPutStrLn gnuh $ "set output \"" ++ (picFile params) ++ "\""
hPutStrLn gnuh $ "unset xtics; unset ytics; unset key"
hPutStrLn gnuh $ "set border 0; set xzeroaxis lt 1; set yzeroaxis lt 1"
hPutStrLn gnuh $ "plot '"++(dataFile params)++"' using 1:2 lt 1 lw 4 lc rgb '#ccccff' with filledcurves, \\"
hPutStrLn gnuh $ " '"++(dataFile params)++"' using 1:2 lt 1 lw 4 lc rgb '#0000ff' with lines"
hClose gnuh
-- Run gnuplot, creating picture
system $ "gnuplot "++(gnuFile params)
putStrLn "done."
return ()
-- testL = [1,1.1,1.2,0,5,-3,2,1,2.5,2.9::Double]
-- kde = train' (KDEParams 1 (VU.fromList $ map (/10) [-50..50::Double]) (KernelBox Gaussian)) testL :: KDE Double
--
-- pdfL = sequence_ $ do
-- x <- map (/10) [-50..50]
-- let y = pdf kde x :: Double
-- seq y (return ())
-- return $ putStrLn $ (show (x::Double)) ++ " " ++ show y