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

