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

NetworkX中如何根据边权重调整有向图边的透明度?

问题描述

想要在有向网络中根据边的权重调整边的透明度,但修改代码后所有边仍保持相同透明度,代码如下:

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

A = np.array([[0, 0, 0],[2, 0, 3],[5, 0, 0]])
G = nx.from_numpy_matrix(A, create_using=nx.DiGraph)
layout = nx.spring_layout(G)
nx.draw(G, layout, with_labels=True)

for edge in G.edges(data="weight"):
    nx.draw_networkx_edges(G, layout, edgelist=[edge], alpha = (edge[2]/10))

plt.show()
问题原因

nx.draw(G)会默认绘制所有节点和边,且边的透明度默认是1。你后续循环绘制的带透明度的边是叠加在这条默认的不透明边上的,所以视觉上所有边看起来都是不透明的。

解决建议

方法1:只绘制节点和标签,再单独绘制每条边

修改nx.draw()的参数,让它只画节点和标签,不画边,然后再循环绘制带透明度的边:

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

A = np.array([[0, 0, 0],[2, 0, 3],[5, 0, 0]])
G = nx.from_numpy_matrix(A, create_using=nx.DiGraph)
layout = nx.spring_layout(G)

# 只绘制节点和标签,不绘制边
nx.draw(G, layout, with_labels=True, edgelist=[])

# 循环绘制每条边,根据权重设置透明度
for edge in G.edges(data="weight"):
    nx.draw_networkx_edges(G, layout, edgelist=[edge], alpha=edge[2]/10)

plt.show()

方法2:批量绘制所有边(更高效)

不用循环,一次性提取所有边和对应的权重计算透明度列表,直接绘制:

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

A = np.array([[0, 0, 0],[2, 0, 3],[5, 0, 0]])
G = nx.from_numpy_matrix(A, create_using=nx.DiGraph)
layout = nx.spring_layout(G)

# 绘制节点和标签
nx.draw(G, layout, with_labels=True, edgelist=[])

# 提取所有边和对应的权重
edges = list(G.edges(data="weight"))
edge_list = [(u, v) for u, v, w in edges]
alphas = [w/10 for u, v, w in edges]

# 批量绘制边,设置对应透明度
nx.draw_networkx_edges(G, layout, edgelist=edge_list, alpha=alphas)

plt.show()

内容的提问来源于stack exchange,提问作者statwoman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:01:05