Python中如何绘制边宽随权重变化的NetworkX图?
问题根源
边宽完全一致是两个代码错误共同导致的:
- 宽度计算逻辑错误:你用的
f.amizade()**0.01是对权重取100次方根,任何正整数算出来的结果都会无限趋近于1。比如权重为1时结果是1,权重为100时结果约为1.047,权重为10000时结果仅约1.096,视觉上完全看不出宽度差异。 - 边绘制逻辑错误:你循环调用
nx.draw_networkx_edges时没有指定当前要绘制的单条边,等于每次调用都会把全图所有边重画一遍,最终所有边的宽度都会被最后一次循环传入的宽度值覆盖。
修正方法
不需要循环逐边绘制,直接从已经存储了边权重的nx_g对象中批量提取所有权重,做合理缩放后一次性传入边绘制函数即可,修正后的可运行代码如下:
def nx_teste(graf, show_plot=False): nx_g = nx.Graph() for i in graf.edges(): nx_g.add_edge(i._pessoa_1._pessoa, i._pessoa_2._pessoa, weight=i._amizade) print(i._pessoa_1, "->", i._pessoa_2, "=", i._amizade) if show_plot: desenho = nx.spring_layout(nx_g) nx.draw_networkx_nodes(nx_g, desenho, node_size=20, node_color="#32CD32", edgecolors="#8DEEEE") nx.draw_networkx_labels(nx_g, desenho, font_size=7) # 提取所有边权重做缩放,系数0.5可根据你的权重数值范围调整 edge_widths = [nx_g[u][v]['weight'] * 0.5 for u, v in nx_g.edges()] nx.draw_networkx_edges(nx_g, desenho, width=edge_widths) # 补充边标签参数,否则不会显示你存储的权重值 edge_labels = nx.get_edge_attributes(nx_g, 'weight') nx.draw_networkx_edge_labels(nx_g, desenho, edge_labels=edge_labels, font_size=6) plt.axis("off") plt.show()
调参提示
- 如果你的权重数值跨度大,可以先做归一化再设置宽度,避免边宽差得太夸张:比如用
(weight - min_w)/(max_w - min_w) * 4 + 0.5的计算逻辑,能保证最细的边宽0.5不会看不见,最粗的边宽4.5不会遮挡节点。 - 缩放系数可以根据实际显示效果调整,直到边宽的区分度符合你的预期。
内容的提问来源于stack exchange,提问作者Maria Lourenço
相关产品推荐
相关产品推荐

