将具有非唯一节点的networkx图形对象存储为graphviz文件

我想在graphviz文件中存储具有非唯一节点的networkx对象。我已经使用标签在networkx中创建了非唯一节点。但是它只能够显示带有非唯一标签的节点。

G = nx.MultiDiGraph()
G.add_node(0)
G.add_node(1)
G.add_node(2)
labels = {0: 'a',1: 'b',2: 'a'}
pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_edges(G,pos)
nx.draw_networkx_labels(MG,pos,labels,font_size=16)

这给出了last语句的返回值和输出:


return value: {0: Text(-0.6135625730904766,-0.6074010681652476,'a'),1: Text(0.9319946933900001,-0.3925989318347525,'b'),2: Text(-0.31843212029952345,1.0,'a')}

将具有非唯一节点的networkx图形对象存储为graphviz文件

是否有办法从draw_networkx_labels获取此输出并使用它来创建graphviz文件。我在graphviz文件输出中需要非唯一节点。我正在尝试执行以下操作:

x = nx.draw_networkx_labels(G,font_size=16)
write_dot(x,"dot.gv")
s = Source.from_file('dot.gv')
s.view()

这将引发错误,因为nx.draw_networkx_labels不返回其在上面打印的对象。如果仅使用G对象,则不会使用标签“ a”和“ b”。另外,有没有更简单的方法可以在networkx中创建非唯一节点?

anxinsimu 回答:将具有非唯一节点的networkx图形对象存储为graphviz文件

您将nodesnode labels混淆了。在图中添加重复的节点没有任何意义。但是,您可以向图的现有节点添加非唯一标签。

看看这段代码:

import networkx as nx

G = nx.MultiDiGraph()
G.add_nodes_from(list(range(5)))

labels = {
    0: 'a',1: 'b',2: 'a',3: 'c',4: 'd'}

G.add_edge(0,1)
G.add_edge(2,1)
G.add_edge(3,2)
G.add_edge(3,4)

# Add the labels as a separate attribute in each node
nx.set_node_attributes(G,labels,'label')

pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_edges(G,pos)
nx.draw_networkx_labels(G,pos,font_size=16)

enter image description here

现在要以graphviz文件格式保存图形:

from networkx.drawing.nx_agraph import write_dot
from graphviz import Source

write_dot(G,"dot.gv")
Source.from_file('dot.gv')

enter image description here

正如您所看到的那样,标签名称将保留。您可以进一步阅读pygraphviz文档,以进一步操作所获得的图形。

参考文献:

您可以检出this Google Colab notebook以获得上面显示的代码。

本文链接:https://www.f2er.com/3170013.html

大家都在问