You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:51:30