Networkx:如何在图形中显示节点和边属性

Posted

技术标签:

【中文标题】Networkx:如何在图形中显示节点和边属性【英文标题】:Networkx: how to show node and edge attributes in a graph drawing 【发布时间】:2013-12-21 07:10:54 【问题描述】:

我有一个图 G,其节点和边的属性为“状态”。我想绘制图形,标记所有节点,并在相应的边/节点之外标记状态。

for v in G.nodes():     
    G.node[v]['state']='X'
G.node[1]['state']='Y' 
G.node[2]['state']='Y'

for n in G.edges_iter():    
    G.edge[n[0]][n[1]]['state']='X'
G.edge[2][3]['state']='Y'

draw.networkx 命令有标签选项,但我不明白如何将属性作为标签提供给该命令。有人可以帮我吗?

【问题讨论】:

【参考方案1】:

它不是那么漂亮 - 但它的工作原理是这样的:

from matplotlib import pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
for v in G.nodes():
    G.node[v]['state']='X'
G.node[1]['state']='Y'
G.node[2]['state']='Y'

for n in G.edges_iter():
    G.edge[n[0]][n[1]]['state']='X'
G.edge[2][3]['state']='Y'

pos = nx.spring_layout(G)

nx.draw(G, pos)
node_labels = nx.get_node_attributes(G,'state')
nx.draw_networkx_labels(G, pos, labels = node_labels)
edge_labels = nx.get_edge_attributes(G,'state')
nx.draw_networkx_edge_labels(G, pos, labels = edge_labels)
plt.savefig('this.png')
plt.show()

【讨论】:

谢谢,但我需要稍作修改。节点的标签与状态不同。我需要节点顶部的 X 和 Y 以及其中的 1 和 2 之类的数字。 如果您需要更复杂(和更漂亮)的标签绘图,您可以考虑使用 Graphviz 进行绘图 - graphivz.org。使用 write_dot 将您的图形从 networkx(如果需要,包括属性)输出为点格式,然后使用 Graphviz 进行处理。 所有节点的位置都在“pos”字典中。您可以使用例如手动标记它们。 x,y=pos[1] 然后 plt.text(x,y,'label') 是否可以只打印属性的值?而不是关键。例如在这种情况下,只打印'X'而不打印'state',如何? @Kairos 见第三行最后一行nx.draw_networkx_edge_labels(G, pos, labels = edge_labels) 将其更改为nx.draw_networkx_edge_labels(G, pos, edge_labels)

以上是关于Networkx:如何在图形中显示节点和边属性的主要内容,如果未能解决你的问题,请参考以下文章

python networkx 在某些条件下删除节点和边

Networkx 和 Matplotlib:如何访问节点属性并将它们显示为注释

在networkx(Python)中获取有向图的根(头)

如何根据注释属性对networkx python图中的节点进行分组?

当networkx中有数百个节点时如何避免重叠?

NetworkX 中的节点与边