将具有 non-unique 个节点的 networkx 图 object 存储为 graphviz 文件
Storing networkx graph object with non-unique nodes as graphviz file
我想在 graphviz 文件中存储一个具有 non-unique 个节点的 networkx object。我使用标签在 networkx 中创建了 non-unique 个节点。但它只能显示带有 non-unique 标签的节点。
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)
这给出了最后一条语句的 return 值和输出:
return value: {0: Text(-0.6135625730904766, -0.6074010681652476, 'a'),
1: Text(0.9319946933900001, -0.3925989318347525, 'b'),
2: Text(-0.31843212029952345, 1.0, 'a')}
有没有办法从 draw_networkx_labels 获取此输出并使用它来创建 graphviz 文件。我在 graphviz 文件输出中需要 non-unique 个节点。我正在尝试执行以下操作:
x = nx.draw_networkx_labels(G,pos,labels,font_size=16)
write_dot(x, "dot.gv")
s = Source.from_file('dot.gv')
s.view()
这将引发错误,因为 nx.draw_networkx_labels 不会 return 上面打印的 object。如果我只使用 G object,它不会使用标签 'a' 和 'b'。另外,是否有更简单的方法在 networkx 中创建 non-unique 个节点?
您混淆了 nodes
和 node 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,labels,font_size=16)
现在开始以 graphviz 文件格式保存图表:
from networkx.drawing.nx_agraph import write_dot
from graphviz import Source
write_dot(G, "dot.gv")
Source.from_file('dot.gv')
如您所见,根据您的问题,标签名称已保留。您可以进一步阅读 pygraphviz 文档以进一步操作您获得的图形。
参考文献:
- https://graphviz.readthedocs.io/en/stable/manual.html
- https://networkx.github.io/documentation/stable/reference/drawing.html
- http://pygraphviz.github.io/documentation/latest/pygraphviz.pdf
您可以查看 this Google Colab notebook 上面显示的代码。
我想在 graphviz 文件中存储一个具有 non-unique 个节点的 networkx object。我使用标签在 networkx 中创建了 non-unique 个节点。但它只能显示带有 non-unique 标签的节点。
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)
这给出了最后一条语句的 return 值和输出:
return value: {0: Text(-0.6135625730904766, -0.6074010681652476, 'a'),
1: Text(0.9319946933900001, -0.3925989318347525, 'b'),
2: Text(-0.31843212029952345, 1.0, 'a')}
有没有办法从 draw_networkx_labels 获取此输出并使用它来创建 graphviz 文件。我在 graphviz 文件输出中需要 non-unique 个节点。我正在尝试执行以下操作:
x = nx.draw_networkx_labels(G,pos,labels,font_size=16)
write_dot(x, "dot.gv")
s = Source.from_file('dot.gv')
s.view()
这将引发错误,因为 nx.draw_networkx_labels 不会 return 上面打印的 object。如果我只使用 G object,它不会使用标签 'a' 和 'b'。另外,是否有更简单的方法在 networkx 中创建 non-unique 个节点?
您混淆了 nodes
和 node 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,labels,font_size=16)
现在开始以 graphviz 文件格式保存图表:
from networkx.drawing.nx_agraph import write_dot
from graphviz import Source
write_dot(G, "dot.gv")
Source.from_file('dot.gv')
如您所见,根据您的问题,标签名称已保留。您可以进一步阅读 pygraphviz 文档以进一步操作您获得的图形。
参考文献:
- https://graphviz.readthedocs.io/en/stable/manual.html
- https://networkx.github.io/documentation/stable/reference/drawing.html
- http://pygraphviz.github.io/documentation/latest/pygraphviz.pdf
您可以查看 this Google Colab notebook 上面显示的代码。