使用图表包在IHaskell(Jupyter)中设置图的大小

gblwokeq  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(155)

我可以使用Haskell图表包在Jupyter Notebook(带有IHaskell)中做一个简单的2D绘图。密码在这里

import Graphics.Rendering.Chart.Easy
cData = [1,2,3,4,3,2,1]
toRenderable  $ do
    layout_title .= "Recovered Signal"
    layout_x_axis . laxis_title .= "Time (msecs)"
    layout_y_axis . laxis_title .= "Original Input Level"
    plot (line "Amplitude" [zip [0,1..] cData])

当代码单元格返回“Renderable”时,图将自动显示在Jupyter单元格中
我想把情节缩小一点。
我试过了

  • 浏览了Wiki上的所有示例,但我看到的唯一大小选项是文件输出。
  • 我检查了Chart函数索引,寻找'size','width',但没有找到任何相关信息
  • 我甚至问了ChatGPT(抱歉,如果这是一个坏词),它失败了。
  • Google没有帮助。您可以更改字体大小,但不能更改打印大小。
  • 我确实找到了'plotsToRenderable',其中提到了一个'minsize',但它对我来说没有意义。

我是一个中等水平的 haskell ,但从来没有学过镜头,这可能是我的问题的一部分。也许是时候学习了。.
任何帮助赞赏!
汤姆

p8ekf7hl

p8ekf7hl1#

眼镜对你没什么帮助。..问题是IHaskell.Display.Charts * 硬编码 * 宽度和高度。有点傻。..
您可以为自定义大小的图表编写自己的 Package 器类型,并复制具有指定大小的示例。

import           System.Directory
import           Data.Default.Class
import           Graphics.Rendering.Chart.Renderable
import           Graphics.Rendering.Chart.Backend.Cairo
import qualified Data.ByteString.Char8 as Char
import           System.IO.Unsafe

import           IHaskell.Display

data SizedRenderable a = Sized
  { size :: (Width, Height)
  , theChart :: Renderable a
  }

instance IHaskellDisplay (SizedRenderable a) where
  display renderable = do
    pngDisp <- chartData renderable PNG

    -- We can add `svg svgDisplay` to the output of `display`, but SVGs are not resizable in the IPython
    -- notebook.
    svgDisp <- chartData renderable SVG

    return $ Display [pngDisp, svgDisp]

chartData :: Renderable a -> FileFormat -> IO DisplayData
chartData (Sized size@(w,h) renderable) format = do
  switchToTmpDir

  -- Write the PNG image.
  let filename = ".ihaskell-chart.png"
      opts = def { _fo_format = format, _fo_size = size }
  mkFile opts filename renderable

  -- Convert to base64.
  imgData <- Char.readFile filename
  return $
    case format of
      PNG -> png w h $ base64 imgData
      SVG -> svg $ Char.unpack imgData

-- TODO add signature, I can't be bothered to look it up
mkFile opts filename renderable = renderableToFile opts filename renderable

相关问题