我正在使用networkX阅读边缘列表。边列表包含以下形式的条目:
1; 2; 3
2; 3; 5
3; 1; 4
其中第三列是重量。当我绘制此图形时,它将权重3显示为:
{'weight': 3}
而不是3。最终,我希望能够使用权重执行操作(例如,计算出的最高权重,仅显示具有权重的边:
'x'等
这是最小的工作代码:
import networkx as nx
import pylab as plt
G=nx.Graph()
G=nx.read_edgelist('sample_with_weights.edges', data= (('weight',int),))
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos=pos)
nx.draw_networkx_edge_labels(G, pos=pos)
nx.draw_networkx_edges(G,pos,width=4, edge_color='g', edge_labels = 'weight', arrows=False)
plt.show()
最佳答案
关于现有代码的一些观察:
该read_edgelist
不适用于该边缘列表文件,因为尚未指定“特殊”定界符;
。
边缘标签应在draw_networkx_edge_labels
函数调用中指定,而不是在draw_networkx_edges
中指定;并且edge_labels
是一个字典,由边缘两元组的文本标签作为键(默认为None)。仅绘制字典中键的标签。 (来自the documentation)
因此,通常的想法是使用edge_labels
有选择地打印边缘权重。请在下面查看内联评论:
import networkx as nx
import pylab as plt
G=nx.Graph()
#Please note the use of the delimiter parameter below
G=nx.read_edgelist('test.edges', data= (('weight',int),), delimiter=";")
pos = nx.spring_layout(G)
#Here we go, essentially, build a dictionary where the key is tuple
#denoting an edge between two nodes and the value of it is the label for
#that edge. While constructing the dictionary, do some simple processing
#as well. In this case, just print the labels that have a weight less
#than or equal to 3. Variations to the way new_labels is constructed
#produce different results.
new_labels = dict(map(lambda x:((x[0],x[1]), str(x[2]['weight'] if x[2]['weight']<=3 else "") ), G.edges(data = True)))
nx.draw_networkx(G, pos=pos)
#Please note use of edge_labels below.
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels = new_labels)
nx.draw_networkx_edges(G,pos,width=4, edge_color='g', arrows=False)
plt.show()
给定一个看起来像...的数据文件
test.edges
1;2;3
2;3;3
3;4;3
2;4;4
4;6;5
1;6;5
...上面的代码片段将产生类似于以下内容的结果:
希望这可以帮助。
关于python - 在NetworkX图形中打印权重问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31575634/