47 lines
1.4 KiB
Haskell
47 lines
1.4 KiB
Haskell
-- 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]
|