如何修复NetworkX中图边宽度设置异常的问题
修复NetworkX自定义边宽度异常问题
你设置了两条边宽度为1,其余为10,但输出出现三条细边,问题出在代码的拼写错误上:
看这条边的定义:
g.add_edge(17, 19,widht=10)
这里把width拼写成了widht,导致这条边没有正确设置width属性。当你用nx.get_edge_attributes(g,'width')获取属性时,这条边不会被包含在结果里,因此widths列表的长度比实际边数少1。在绘制时,Matplotlib会循环使用width列表中的值,最后一条边会重复使用列表第一个值(也就是1),所以出现了第三条细边。
只需修正拼写错误,把widht改成width即可:
g.add_edge(17, 19, width=10)
完整修正后的代码如下:
import matplotlib.pyplot as plt import networkx as nx # 创建图 g = nx.Graph() # 添加节点 nodes = range(1, 22) g.add_nodes_from(nodes) # 添加边(已修正拼写错误) g.add_edge(1, 2, width=1) g.add_edge(1, 3, width=10) g.add_edge(2, 3, width=10) g.add_edge(3, 4, width=10) g.add_edge(4, 5, width=1) g.add_edge(5, 6, width=10) g.add_edge(5, 7, width=10) g.add_edge(6, 7, width=10) g.add_edge(5, 9, width=10) g.add_edge(6, 9, width=10) g.add_edge(7, 8, width=10) g.add_edge(6, 10, width=10) g.add_edge(10, 11, width=10) g.add_edge(6, 11, width=10) g.add_edge(11, 12, width=10) g.add_edge(9, 10, width=10) g.add_edge(9, 15, width=10) g.add_edge(10, 13, width=10) g.add_edge(12, 13, width=10) g.add_edge(13, 14, width=10) g.add_edge(14, 16, width=10) g.add_edge(15, 14, width=10) g.add_edge(9, 14, width=10) g.add_edge(16, 17, width=10) g.add_edge(13, 18, width=10) g.add_edge(17, 18, width=10) g.add_edge(17, 20, width=10) g.add_edge(17, 19, width=10) # 此处已修正拼写错误 g.add_edge(19, 20, width=10) g.add_edge(18, 20, width=10) g.add_edge(19, 21, width=10) g.add_edge(20, 21, width=10) widths = list(nx.get_edge_attributes(g,'width').values()) # 节点位置 pos={ 1:(13,78), 2:(24,87), 3:(23,77), 4:(25,68), 5:(27,59), 6:(27,46), 7:(17,49), 8:(5,36), 9:(42,58), 10:(40,36), 11:(35,31), 12:(40,12), 13:(61,30), 14:(70,43), 15:(72,55), 16:(82,40), 17:(83,20), 18:(77,15), 19:(93,14), 20:(88,9), 21:(97,4), } # 绘制图 nx.draw(g, pos, with_labels=True, node_color="orange", node_size=300, edge_color="black", width=widths) # 设置标题并显示 plt.title('Gabriel Graph (102)') plt.xlabel('X') plt.ylabel('Y') plt.show()
另外,顺便优化了节点添加的代码,用add_nodes_from代替逐个添加,更简洁。
内容的提问来源于stack exchange,提问作者Talal Tariq
相关产品推荐
相关产品推荐

