使用pydot显示图表而不保存

18 python pydot

我想用pydot显示一个简单的图形.

我的问题是,有没有办法显示图形而不将其写入文件,因为目前我使用写入功能首先绘制,然后必须使用图像模块来显示文件.

但有没有什么方法可以直接在屏幕上打印图形而不保存?


另外作为一个更新,我想在同一个问题中问我观察到,当我使用图像模块的show命令时图像得到很快保存时,需要花费大量时间才能看到图像....有时候我得到错误,图像无法打开,因为它被删除或保存在不可用的位置,这是不正确的,因为我将它保存在我的桌面.....有谁知道发生了什么,是否有更快的方式得到图像加载.....

非常感谢....

Ioa*_*dis 22

您可以从渲染图像pydot调用GraphVizdot,没有任何文件写入磁盘.然后只是绘制它.这可以如下完成,假设g是一个pydot图:

from cStringIO import StringIO

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import networkx as nx

# create a networkx graph
G = nx.MultiDiGraph()
G.add_nodes_from([1,2] )
G.add_edge(1, 2)

# convert from networkx -> pydot
pydot_graph = G.to_pydot()

# render pydot by calling dot, no file saved to disk
png_str = pydot_graph.create_png(prog='dot')

# treat the dot output string as an image file
sio = StringIO()
sio.write(png_str)
sio.seek(0)
img = mpimg.imread(sio)

# plot the image
imgplot = plt.imshow(img, aspect='equal')
plt.show(block=False)
Run Code Online (Sandbox Code Playgroud)

这是为向图中特别有用,因为该matplotlib能力networkx严重限制为这样的图.

另请参阅此pull请求,它直接引入此类功能networkx.剩下的就是有人编写一个接口来加载和绘制生成的布局,GraphViz就像MATLAB文件交换GraphViz接口,MATLAB GraphViz布局导入器,GraphViz4Matlab.

  • 就像一个快速的附录,如果你在笔记本中,你可以使用`Image(png_str)`(来自`IPython.display`)直接渲染`png_str`(字节). (3认同)
  • @EricCousineau 通过语句 `g = pydot.graph_from_dot_data(dot_text)` 看来您正在使用较旧的 `pydot` 版本。请注意,从“pydot == 1.2.3”开始,函数“graph_from_dot_data”在所有情况下都会返回一个“列表”(在以前的版本中,它在单例时返回一个图)。另请参阅[此评论](https://github.com/erocarrera/pydot/issues/159#issuecomment-334799706)和https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/pydot.py#L235 ,https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/dot_parser.py#L545。 (2认同)

mic*_*pes 19

这是使用IPython的简单解决方案:

from IPython.display import Image, display

def view_pydot(pdot):
    plt = Image(pdot.create_png())
    display(plt)
Run Code Online (Sandbox Code Playgroud)

用法示例:

import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。正是我需要的:要立即在控制台中以尽可能少的行显示图形(例如spyder) (2认同)

nim*_*odm 0

恐怕pydot用来graphviz渲染图表。即,它运行可执行文件并加载生成的图像。

底线 - 不,您无法避免创建该文件。

  • johntex提供了解决方案 (2认同)