Python 使用pydot显示图形而不保存

Python 使用pydot显示图形而不保存,python,pydot,Python,Pydot,我正在尝试使用pydot显示一个简单的图形 我的问题是,有没有任何方法可以在不将图形写入文件的情况下显示图形,因为目前我首先使用写入功能绘制图形,然后必须使用图像模块显示文件 但是,有没有办法直接在屏幕上打印图形而不保存 另外,作为更新,我想在这个问题中提出同样的问题,我注意到,当我使用图像模块的show命令时,图像保存得非常快,但要看到图像需要花费相当长的时间。。。。有时我也会遇到这样的错误,即图像无法打开,因为它被删除或保存在不可用的位置,而这在我将其保存在桌面时是不正确的。。。。。有人知

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

我的问题是,有没有任何方法可以在不将图形写入文件的情况下显示图形,因为目前我首先使用写入功能绘制图形,然后必须使用图像模块显示文件

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


另外,作为更新,我想在这个问题中提出同样的问题,我注意到,当我使用图像模块的show命令时,图像保存得非常快,但要看到图像需要花费相当长的时间。。。。有时我也会遇到这样的错误,即图像无法打开,因为它被删除或保存在不可用的位置,而这在我将其保存在桌面时是不正确的。。。。。有人知道发生了什么吗?有没有更快的方法加载图像


非常感谢……

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

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

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

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

import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()
gr=。。。
导入临时文件、图像
fout=tempfile.NamedTemporaryFile(后缀=“.png”)
gr.write(fout.name,format=“png”)
Image.open(fout.name.show())

Image
来自您可以通过调用
GraphViz
dot
来渲染
pydot
中的图像,而无需将任何文件写入磁盘。那就画出来。假设
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)
这对于有向图特别有用,因为
networkx
matplotlib
功能适用于此类图


另请参见此部分,它将此类功能直接引入到
networkx
。剩下的工作就是编写一个接口,将
GraphViz
生成的布局加载并绘制为文件交换上的
MATLAB

以下是一个使用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)

这在Python3 shell中非常有效(需要该包):

导入pydot
从PIL导入图像
从io导入字节io
graph=pydot.Dot(graph_type=“digraph”)
node=pydot.node(“你好,pydot!”)
图.添加_节点(节点)
Image.open(BytesIO(graph.create_png()).show()
您还可以向具有pydot
graph
成员的对象添加一个名为
\u repr\u html
的方法,以在Jupyter笔记本中呈现一个清晰的SVG:

class-MyClass:
定义初始化(自,图形):
self.graph=graph
定义报告html(自我):
返回self.graph.create_svg().decode(“utf-8”)
方法将SVG嵌入到显示器中,可用于显示图形而无需保存到文件中

此处,用于将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'))

它也适用于
AGraph类

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

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

使用

要显示保存为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

相关:相关但适用于pygraphviz:我也想知道如何在pygraphviz中实现它。约翰泰克斯提供了一个解决方案查看我的解决方案。它很简单,并且避免创建文件:)虽然从技术上讲是正确的,但答案没有帮助。您确实需要创建文件,但不必写入磁盘。请参阅此问题的其他答案。作为快速补充,如果您在笔记本中,您可以直接使用
Image(png\u str)
(来自
IPython.display
)渲染
png\u str
(字节)。在此改编中做了一些小的调整:感谢发布此代码!(结果只是使用了
pydot
,因为在本例中它能够处理感兴趣的图形。)@EricCousineau通过语句
g=pydot.graph\u from\u dot\u data(dot\u text)
看起来您使用的是较旧的
pydot
版本。请注意,从
pydot==1.2.3
开始,函数
graph\u from\u dot\u data
在所有情况下都返回一个
列表
(在以前的版本中,它在单例时返回一个图形)。还有,还有,啊,谢谢你!(更新:)这应该是公认的答案。正是我所需要的:从2019年3月起,为了立即用控制台(例如spyder)显示尽可能少的行数的图形,Python Imaging Library大部分被替换为:对于我来说,这不会弹出一个带有图形图片的窗口……现在我扩展了我的答案,并包含了一个代码片段来显示图形。
img
是可以显示或以其他方式处理的结果“字节对象”。在本例中,我演示了如何在不保存到磁盘的情况下显示它
from PIL import Image
from io import BytesIO