如何在不保存为文件的情况下捕获pygraphviz图像呈现?

5

pygraphviz是否允许您将图像渲染到变量中?我想通过网页提供动态图像,而无需将图形渲染到磁盘。


如果你有可用的代码,不介意与我们分享吗?如果你的代码运行良好,展示一下你的伟大吧!;) - Charlie Parker
3个回答

1

根据源代码,如果您在调用AGraph对象的draw()方法时省略了path参数(或将其设置为None),它将返回一个bytes对象而不是保存到文件中。不要忘记指定format参数。

例如,假设您已经有一个名为AAGraph对象,并且您想绘制此图形,您可以这样做:

from IPython.display import Image, display

img_bytes = A.draw(format="png")
img = Image(img_bytes)
display(img)

3
你有可以复制粘贴并且能够运行的代码示例吗? - Charlie Parker

0

我找不到一种不涉及文件的方法来实现这个,所以我创建了这个方便的函数:

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

def plot_network(G: nx.DiGraph):
  ag = nx.nx_agraph.to_agraph(G)
  ag.layout(prog="dot")
  temp = tempfile.NamedTemporaryFile(delete=False)
  tempname = temp.name + ".png"
  ag.draw(tempname)
  img = mpimg.imread(tempname)
  plt.imshow(img)
  plt.show()
  os.remove(tempname)

-1

我认为这就是你想要的:

# https://dev59.com/814b5IYBdhLWcg3w7FYv

import dgl
import numpy as np
import torch

import networkx as nx

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

from pathlib import Path

g = dgl.graph(([0, 0, 0, 0, 0], [1, 2, 3, 4, 5]), num_nodes=6)
print(f'{g=}')
print(f'{g.edges()=}')

# Since the actual graph is undirected, we convert it for visualization purpose.
g = g.to_networkx().to_undirected()
print(f'{g=}')

# relabel
int2label = {0: "app", 1: "cons", 2: "with", 3: "app3", 4: "app4", 5: "app5"}
g = nx.relabel_nodes(g, int2label)

# https://networkx.org/documentation/stable/reference/drawing.html#module-networkx.drawing.layout
g = nx.nx_agraph.to_agraph(g)
print(f'{g=}')
print(f'{g.string()=}')

# draw
g.layout()
g.draw("file.png")

# https://dev59.com/7HrZa4cB1Zd3GeqP0Ub4
img = mpimg.imread('file.png')
plt.imshow(img)
plt.show()

# remove file https://dev59.com/kGw05IYBdhLWcg3w11Qk
Path('./file.png').expanduser().unlink()
# import os
# os.remove('./file.png')

你基本上需要从文件中显式地渲染图形对象,然后删除它(不幸的是我不知道更好的答案)。有关更多详细信息,请查看我的长篇讨论,了解我为什么认为pygraphviz是可视化的首选(而不是networkx):https://dev59.com/814b5IYBdhLWcg3w7FYv#67439711


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接