Haskell Gnuplot不响应title函数

4

我正在尝试在Haskell中使用Gnuplot制作的绘图上添加标题。虽然程序会在创建的独立窗口中生成图形,但我似乎无法让它响应标题函数。我是否错误地使用了标题函数?

我正在使用Stack,它包括:

 - only "-gnuplot" added to the "dependencies:" section of package.yaml
 - resolver: lts-15.7 in an unmodified stack.yaml.

在运行Linux Mint 19的计算机上。以下是代码和弹出窗口的屏幕截图:

module Main where

import Graphics.Gnuplot.Advanced
import Graphics.Gnuplot.Plot.TwoDimensional as P2D
import Graphics.Gnuplot.Graph.TwoDimensional as G2D
import Graphics.Gnuplot.Terminal.X11 as X11

zeroToTen = [0.0, 0.1 .. 10.0 :: Double]

main :: IO ()
main = do
  plot (X11.title "My Title" X11.cons) (P2D.function G2D.lines zeroToTen sin)
  _  <- getLine
  return ()

screen shot of the pop-up window the program creates


1
但是你从“终端”导入这个。我还没有使用“X11”,但是这不应该将控制台/终端的标题转换而不是窗口吗? - Willem Van Onsem
我没有看到任何证据表明它改变了什么。也许我不知道在哪里查找标题? - David Jacobs
1
我可以在Ubuntu 16.04上重现这个问题。没有任何关于标题字符串的痕迹。命名空间Graphics.Gnuplot.Terminal中唯一具有标题函数的其他图形前端是WXT,但使用它时,标题也不会改变。 - MikaelF
1个回答

2

这是gnuplot(软件包)中的一个错误。以下是构建X11终端选项为 gnuplot 可解析命令行参数的代码块:

文件:X11.hs

-- Part of a record update, hence the trailing comma
Terminal.options =
     "x11" :
     catMaybes (
           (fmap quote $ title_ term) :
        (fmap (formatBool "persist") $ persist_ term) :
        []),

在倒数第三行,term 记录的 title_ :: Maybe String 字段被 quote 函数(只是 show 的别名)用引号括起来。问题在于为了被 gnuplot 解析,它还应该以 title 为前缀(详见手册)。在修复之前,您可以始终将 gnuplot 配置为本地包并从那里构建它。
以下是修复内容(X11.hs 的第 43 行):
(fmap (("title " ++) . quote) $ title_ term) :

工作截图

顺便说一下,有一种更优化的导入包的方式。写成import X as Y的意思是:“将所有内容导入全局命名空间,但也给我一个别名为导入符号的Y”。更好的方式是import qualified X as Y,它将导入的模块限制在Y命名空间内。

最后注意事项 如果您尝试自己构建gnuplot,您会发现gnuplot无法编译,因为GHC 8.4中“Semigroup-Monoid”提案导致了缺少几个Semigroup实例。解决此问题的方法很简单,只需添加一个引用Monoid实例中的mappend方法的Semigroup实例即可:

import Data.Semigroup
instance Semigroup Script where
  (<>) = mappend

谢谢。我在我的电脑上实现了这个,它也对我有效。 - David Jacobs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接