【问题标题】:how to plot a graph using haskell graphViz如何使用 haskell graphViz 绘制图形
【发布时间】:2014-01-01 06:47:36
【问题描述】:

我打算使用 Haskell graphViz 绘制图表。我是haskell的新手,所以这对我来说很困难。有人可以给我看一个简单的例子吗?我实际上需要一个非常简单的示例,以便我可以理解它并在我正在处理的场景中使用它

我在尝试安装 chart-cairo 时遇到上述错误。我在网上看到了一些例子,它们都需要chart-cairo。知道如何解决吗?

*已编辑” 执行https://stackoverflow.com/users/2827654/jamshidh 给出的代码后得到的输出

【问题讨论】:

  • 请告诉我们你付出了一些努力。你阅读过 Haskell 库的文档吗?您是否阅读过 GraphViz 工具的文档?之后你尝试了什么?哪里出错了?
  • 先尝试用 .dot 文件手动编写 graphviz 怎么样?对于一个简单的图表,从 Haskell 打印出 .dot 语法然后使用库可能更容易。
  • 我编辑了我的问题。并提到了我在尝试安装 chart-cairo 时遇到的错误。希望大家帮忙
  • 您是否按照“Please install ...”的说明进行操作?
  • 我实际上尝试了别的东西,而不是开罗。实际上,其他人给了我这个例子。 lpaste.net/97781 。但问题是有一个错误。

标签: haskell graph plot graphviz


【解决方案1】:

(这解决了您在标题中描述的原始问题,并且不涉及安装chart-cairo或chart等的问题,这些问题确实应该被分解成不同的问题)......

graphviz 包在模块 Data.Graph.Inductive.Example 中包含一些示例图,可用于帮助您启动和运行。您可以在http://hackage.haskell.org/package/fgl-5.3/docs/Data-Graph-Inductive-Example.html..查看包含的图表列表。我将使用一个名为clr479的图表。

一旦你有了一个图表,你可以使用graphToDot将它转换成一个代表点格式的内部结构。请注意,您需要提供一些参数,这些参数在http://hackage.haskell.org/package/graphviz-2999.11.0.0/docs/Data-GraphViz.html 中进行了描述。为了启动和运行,我将使用提供的nonClusteredParams

let graphInDotFormat = graphToDot nonClusteredParams clr479 

然后,您需要将其转换为适合输入到dot 程序的文本。你可以用renderDot . toDot来做到这一点

let outputText = renderDot $ toDot graphInDotFormat

并且,像往常一样,您需要将文本转换为字符串才能使用putStrLn(不要只使用show,因为它会包含引号和转义序列,dot 不会理解)

putStrLn $ unpack outputText

将所有这些放在一起,最终的程序 createDotFile.hs 将是

import Data.Text.Lazy
import Data.GraphViz
import Data.Graph.Inductive.Example
import Data.GraphViz.Printing

main = putStrLn $ unpack $ renderDot $ toDot $ graphToDot nonClusteredParams clr479 

使用ghc createDotFile.hs 进行编译(如果您想对输出进行任何操作,请记住 cabal 安装所需的包以及 graphviz 本身)。在命令行上,您现在可以将此程序的输出通过管道传输到dot,这会将其转换为通常的格式....例如,这里我转换为 svg

./createDotFile | dot -Tsvg > graph.svg

在我的 linux 机器上可以通过键入来查看

eog graph.svg


编辑-

为了澄清,需要将 haskell 程序的输出作为 GraphViz 的输入提供。在 Windows 上安装 graphviz 的 msi 文件在这里http://www.graphviz.org/Download_windows.php

【讨论】:

  • 首先,要感谢您,因为它运行时不会产生任何错误。但问题是我在 windows 上这样做,而不是在 Linux 上。那么,您知道我如何查看图表吗?我会将上面得到的输出粘贴到我的问题中,名为“EDITED”
  • 根据hackage描述-“这是graphviz库的顶级模块。它提供了将Graphs转换为Graphviz程序套件使用的Dot语言的功能(以及有限的执行反向操作的能力)。”因此,据此,Data.Graph 程序的输出是另一个必须由dot 程序处理的程序,它是 GraphViz 的一部分。换句话说,您需要在您的计算机上安装 GraphViz/dot 并使用它来创建实际的图形(即作为 svg)。
  • 我在答案中添加了一个指向 graphviz for windows 的链接。不过我自己从来没有尝试过......
  • 很好的解释,如果我已经解析了一个点图(例如使用 xDotText <- L.readFile "tempBdd.dot" let xDotGraph = parseDotGraphLiberally xDotText :: G.DotGraph String ),我之后如何更改(或替换)参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多