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

Networkx使用bbox参数时按权重分配节点颜色的异常问题

NetworkX节点自定义方框颜色不生效的解决办法

你遇到的问题是因为nx.draw()中的bbox参数不支持传入颜色列表批量设置每个标签方框的颜色,它会把整个列表当作单一颜色值处理,导致所有节点的方框颜色一致。

要实现每个节点方框对应权重上色,需要拆分绘制步骤:先绘制不带标签的节点(保留原有的颜色映射),再单独绘制每个标签,并为每个标签的方框设置对应颜色。

修改后的完整代码

from pprint import pprint

import matplotlib.pyplot as plt
import networkx as nx
from networkx.drawing.nx_pydot import graphviz_layout

G = nx.Graph()
G.add_node((1, 4), weight=10/255)
G.add_node((7, 2), weight=130/255)
G.add_node((9, 7), weight=250/255)
node_labels = dict()
node_colors = []
for node, node_data in G.nodes.items():
    node_labels[node] = node
    node_colors.append(node_data['weight'])
pprint(node_labels)
pprint(node_colors)

fig, axs = plt.subplots(ncols=2)
plt.margins(0.0)
pos = graphviz_layout(G, prog='dot')

# 左侧图:默认节点样式(颜色正常)
nx.draw(G, pos=pos, with_labels=True, labels=node_labels, node_color=node_colors, cmap=plt.cm.gray, ax=axs[0])

# 右侧图:自定义带颜色的方框标签
# 1. 先绘制不带标签的节点
nx.draw(G, pos=pos, with_labels=False, node_color=node_colors, cmap=plt.cm.gray, ax=axs[1])
# 2. 绘制标签并获取每个文本对象
texts = nx.draw_networkx_labels(G, pos=pos, labels=node_labels, ax=axs[1])
# 3. 为每个文本对象设置对应颜色的方框
for text, color_val in zip(texts.values(), node_colors):
    # 根据权重值从cmap中获取对应颜色
    face_color = plt.cm.gray(color_val)
    text.set_bbox(dict(facecolor=face_color, edgecolor='black', boxstyle='round,pad=0.2'))

fig.tight_layout()
plt.show()

关键说明

  • nx.draw_networkx_labels()会返回一个字典,键是节点,值是对应的Matplotlib文本对象,我们可以遍历这些对象单独设置bbox属性。
  • 通过plt.cm.gray(color_val)将权重值(0-1之间)转换为cmap对应的RGB颜色,确保方框颜色和节点颜色保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:10:25