我正在尝试使用pydot显示一个简单的图形。
我的问题是,有没有办法显示图形而不将其写入文件,因为目前我使用write函数首先绘制,然后必须使用Image模块来显示文件。
但是有没有办法直接在屏幕上打印图形而不保存?
另外作为更新,我想在同一个问题中提出,我观察到当我使用图像模块的show命令时图像得到快速保存时,需要花费大量时间才能看到图像... 。有时候我得到错误,图片无法打开,因为它被删除或保存在不可用的位置,这是不正确的,因为我将它保存在我的桌面.....有谁知道发生了什么,是否有加载图像的更快方法.....
非常感谢....
答案 0 :(得分:21)
您可以通过调用pydot
的{{1}}从GraphViz
呈现图像,而无需将任何文件写入磁盘。然后只是绘制它。假设dot
是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)
的{{1}}功能对于此类图表来说是severely limited。
另请参见此pull request,它将此类功能直接引入matplotlib
。剩下的就是有人编写一个界面来加载和绘制由networkx
生成的布局作为networkx
在文件交换GraphViz interface,MATLAB 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