使用pydot显示图表而不保存

时间:2011-01-04 18:19:40

标签: python pydot

我正在尝试使用pydot显示一个简单的图形。

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

但是有没有办法直接在屏幕上打印图形而不保存?


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

非常感谢....

7 个答案:

答案 0 :(得分:21)

您可以通过调用pydot的{​​{1}}从GraphViz呈现图像,而无需将任何文件写入磁盘。然后只是绘制它。假设dotg图表,可以按照以下方式完成:

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) 的{​​{1}}功能对于此类图表来说是severely limited

另请参见此pull request,它将此类功能直接引入matplotlib。剩下的就是有人编写一个界面来加载和绘制由networkx生成的布局作为networkx在文件交换GraphViz interfaceMATLAB GraphViz Layout importer,{{3}上生成的布局}。

答案 1 :(得分:15)

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

from IPython.display import Image, display

def view_pydot(pdot):
    plt = Image(pdot.create_png())
    display(plt)

使用示例:

import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)

答案 2 :(得分:3)

基于this answer(如何在python中显示图像),这里有几行:

gr = ... <pydot.Dot instance> ...

import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()

Image来自Python Imaging Library

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

这在Python 3 shell中为我工作(需要Pillow包):

/proc/cpuinfo

您还可以将一个名为import pydot from PIL import Image from io import BytesIO graph = pydot.Dot(graph_type="digraph") node = pydot.Node("Hello pydot!") graph.add_node(node) Image.open(BytesIO(graph.create_png())).show() 的方法添加到具有pydot _repr_html_成员的对象中,以便在Jupyter笔记本中呈现清晰的SVG:

graph

答案 5 :(得分:0)

IPython.display.SVG方法将SVG嵌入到显示器中,可用于显示图形而不保存到文件中。

在这里,keras.utils.model_to_dot用于将Keras模型转换为点格式。

from IPython.display import SVG
from tensorflow import keras

#Create a keras model.
model = keras.models.Sequential()
model.add(keras.layers.Dense(units=2, input_shape=(2,1), activation='relu'))
model.add(keras.layers.Dense(units=1, activation='relu'))

#model visualization
SVG(keras.utils.model_to_dot(model).create(prog='dot', format='svg'))

答案 6 :(得分:0)

它也适用于 AGraph Class

https://pygraphviz.github.io/documentation/latest/reference/agraph.html#pygraphviz.AGraph.draw

<块引用>

如果 path 为 None,则结果作为 Bytes 对象返回。

因此,只需省略此参数即可返回图像数据而不将其保存到磁盘

使用

from networkx.drawing.nx_agraph import graphviz_layout, to_agraph
g = nx.Graph()
...
A = to_agraph(g)
A.draw()

https://networkx.org/documentation/stable/reference/drawing.html#module-networkx.drawing.nx_agraph

为了显示保存为 Bytes 对象的结果图像:

# create image without saving to disk
img = A.draw(format='png')
image = Image.open(BytesIO(img))
image.show(title="Graph")

需要

from PIL import Image
from io import BytesIO