28

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

我的问题是,有什么方法可以在不将其写入文件的情况下显示图形,因为目前我使用 write 函数首先绘制,然后必须使用 Image 模块来显示文件。

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


另外作为一个更新,我想在同一个问题中问我观察到,虽然当我使用 Image 模块的 show 命令时图像会很快保存,但要看到图像需要相当长的时间....有时也我收到无法打开图像的错误,因为它被删除或保存在不可用的位置,这是不正确的,因为我将它保存在我的桌面上.....有谁知道发生了什么,有没有更快的方法加载图像......

非常感谢....

4

7 回答 7

30

这是一个使用 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)
于 2016-04-06T22:03:36.350 回答
27

pydot您可以通过调用GraphViz's来渲染图像,dot而无需将任何文件写入磁盘。然后只是绘制它。这可以按如下方式完成:

import io

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` to a `pydot` graph
pydot_graph = nx.drawing.nx_pydot.to_pydot(g)

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

# treat the DOT output as an image file
sio = io.BytesIO()
sio.write(png_str)
sio.seek(0)
img = mpimg.imread(sio)

# plot the image
imgplot = plt.imshow(img, aspect='equal')
plt.show()

这对于有向图特别有用。

另请参阅此拉取请求,它将此类功能直接引入networkx.

于 2013-08-30T00:13:23.117 回答
3

基于这个答案(如何在 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 图像库

于 2012-11-28T21:50:32.777 回答
1

这在 Python 3 shell 中对我有用(需要Pillow包):

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()

您还可以添加一个调用_repr_html_到具有 pydotgraph成员的对象的方法,以在 Jupyter 笔记本中呈现漂亮的清晰 SVG:

class MyClass:
    def __init__(self, graph):
        self.graph = graph

    def _repr_html_(self):
        return self.graph.create_svg().decode("utf-8")
于 2020-06-18T00:04:05.917 回答
1

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'))
于 2020-06-20T15:17:42.327 回答
0

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

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

于 2011-01-04T20:00:31.023 回答
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
于 2021-03-17T12:03:32.097 回答