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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:27:05