【问题标题】:Is it possible to get output of pydot graph without intermediate file?是否可以在没有中间文件的情况下获得 pydot 图的输出?
【发布时间】:2016-11-13 02:07:08
【问题描述】:

我有一个非常简单的图表,我想将其绘制为 svg。例如:

# graph.dot
graph { 
        a -- b; 
        b -- c; 
    } 

我目前正在使用pydot读取文件然后生成svg文件如下:

import pydot
graphs = pydot.graph_from_dot_file('graph.dot')
graphs[0].write_svg('graph.svg') # there is only 1 graph so the 0 index.

但是,我需要这样做而不需要中间文件 graph.dotgraph.svg。我在一个字符串中有graph.dot的代码内容,对应我需要在字符串中输出svg。

我需要类似的东西:

graph_dot = "... ..." # string, I have this
graph_svg = convert_dot_to_svg(graph_dot) 
# i need something like convert_dot_to_svg()

我的问题不仅限于 pydot。如果有人知道我可以使用的 web api,那么它也可以。

非常感谢,提前。

【问题讨论】:

  • 我从未使用过 pydot(但我知道 Graphviz),但快速浏览一下 pydot 文档表明您可以使用类似文件的对象而不是文件。因此,您应该尝试使用标准 io 模块中的 StringIO 或 BytesIO。
  • @PM2Ring 你说得对,我可以使用io 接受输入。但是如何替换write_svg函数呢?
  • @PM2Ring 如前所述,问题不仅限于 pydot 本身。你能告诉我一种在 Graphviz 中获取与点字符串对应的 svg 字符串的方法吗?任何方式都可以。
  • 如果.write_svg 接受打开的文件句柄而不是文件名,那么如果您向其提供 StringIO 或 BytesIO 对象,它将“正常工作”。如果您以前从未使用过io 模块,我建议您学习文档并进行一些实验;这是一个非常有用的模块。
  • 好酷...谢谢:)

标签: python svg graphviz pygraphviz pydot


【解决方案1】:

在花更多时间查看pydot 对象和graph 对象上的可用方法之后,可以弄清楚:

以下代码有效:

import pydot    
dot_string = """graph { 
                    a -- b; 
                    b -- c; 
                } """

graphs = pydot.graph_from_dot_data( dot_string )
svg_string = graphs[0].create_svg() 

【讨论】:

  • FWIW,pydot 仍然需要安装 graphviz。引自this blog post:“如果我们查看 Pydot Pypi 页面,您已经可以看到关于此的提示,因为它会告诉您以下内容;Pydot 是 Graphviz 的接口,可以解析并转储为 Grapgiz 使用的 DOT 语言。 Pydot 是用纯 Python 编写的。”
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
相关资源
最近更新 更多