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
相关产品推荐
相关产品推荐

