如何将NetworkX网络图边颜色与jet色卡的colorbar关联映射
实现边颜色与jet色卡绑定的方案
核心修改逻辑
- 复用你已经定义的
Normalize归一化对象,将边的数值(Edge_color数组的元素)直接映射为jet色系对应的颜色值,无需手动写分支判断固定颜色 - 要保证归一化的
vmin、vmax和你colorbar设置的数值范围一致,这里保留了你原代码0-100的刻度范围,如果你边数值的原生范围是0-0.18,会先做缩放映射到0-100区间,也可以直接修改vmin、vmax为边数值的原生范围,改对应刻度即可 - 修正原代码的语法bug:包括循环缩进错误、最后强制覆盖
color = 'darkred'导致颜色判断失效的问题,补充了缺失的Edge_color、Edge_we示例值
完整可运行代码
import networkx as nx import matplotlib.pyplot as plt # 原始配置 names = ['A', 'B', 'C'] positions = [(0,1),(0,0),(1,0)] edges = [('A','B'),('B', 'C'),('C','A')] Connection_style = ["arc3,rad=0","arc3,rad=0","arc3,rad=0"] # 补充缺失的示例参数:边宽度、边数值 Edge_we = 2 # 示例边数值,对应你原代码的0-0.18范围 Edge_color = [0.03, 0.09, 0.17] plt.figure('My graph problem', figsize=[4, 3]) # 创建图 G = nx.MultiDiGraph(format='png', directed=True) for index, name in enumerate(names): G.add_node(name, pos=positions[index]) layout = dict((n, G.nodes[n]["pos"]) for n in G.nodes()) nx.draw(G, pos=layout, with_labels=False, node_size=30, node_color='darkorange',width=Edge_we) ax = plt.gca() # 提前定义颜色映射规则,和后续colorbar完全一致 vmin = 0 vmax = 100 cmap = plt.cm.jet norm = plt.Normalize(vmin=vmin, vmax=vmax) # 如果你的Edge_color原生范围是0-0.18,先缩放映射到0-100 edge_val_scaled = [ec / 0.18 * 100 for ec in Edge_color] for edge, cs, val in zip(edges, Connection_style, edge_val_scaled): # 直接用norm+cmap得到对应颜色,删除手动颜色判断分支 color = cmap(norm(val)) ax.annotate("", xy=layout[edge[0]], xycoords='data', xytext=layout[edge[1]], textcoords='data', arrowprops=dict(arrowstyle="wedge", color=color, shrinkA=3, shrinkB=3, patchA=None, patchB=None, relpos=(1,20), connectionstyle=cs ), ) for nome, pos1 in zip(names, positions): ax.text(pos1[0], pos1[1], nome, fontsize=7, fontweight='bold') # 生成colorbar,和前面的映射规则完全一致 sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm) sm._A = [] plt.colorbar(sm, shrink=0.9, ticks=[0, 20, 40, 60, 80, 100]) plt.show()
注意事项
如果你的Edge_color数值范围不是示例的0-0.18,可以直接修改归一化规则:把norm = plt.Normalize(vmin=min(Edge_color), vmax=max(Edge_color)),同时调整colorbar的ticks为对应数值即可,不需要额外做数值缩放。
内容的提问来源于stack exchange,提问作者Rasoul Sadeghi
相关产品推荐
相关产品推荐

