-- Implementation from -- https://github.com/IHaskell/IHaskell/blob/master/ihaskell-display/ihaskell-matplotlib/IHaskell/Display/Matplotlib.hs module MplIHaskell where import qualified Data.ByteString.Char8 as Char import qualified Data.ByteString.UTF8 as BSU import qualified Data.Text.Encoding as T.Encoding import System.IO.Temp import System.FilePath (()) import Graphics.Matplotlib import IHaskell.Display instance IHaskellDisplay Matplotlib where display = graphDataDisplayBoth -- Width and height w, h :: Int w = 300 h = 300 graphDataPNG :: Matplotlib -> IO DisplayData graphDataPNG m = do withSystemTempDirectory "ihaskell-matplotlib" $ \tmpdir -> do let path = tmpdir "ihaskell-matplotlib.png" -- Write the image. res <- file path m case res of Left _ -> error "Matplotlib could not generate an immage" Right _ -> do -- Read back, and convert to base64. imgData <- Char.readFile path return $ png w h $ base64 imgData graphDataSVG :: Matplotlib -> IO DisplayData graphDataSVG m = do res <- toSvg m case res of Left s -> error s Right f -> return $ svg $ T.Encoding.decodeUtf8 $ BSU.fromString f graphDataDisplayBoth :: Matplotlib -> IO Display graphDataDisplayBoth fig = do pngDisp <- graphDataPNG fig svgDisp <- graphDataSVG fig return $ Display [pngDisp, svgDisp]