使用colormap为网络节点着色时触发float()参数TypeError问题求助
问题原因分析
- 核心触发原因:Python3中字典的
values()方法返回的是dict_values视图对象而非列表,nx.draw()的node_color参数要求传入颜色值组成的序列(列表、数组等),底层处理时无法解析dict_values类型,尝试强制转float时触发报错。 - 潜在额外问题:你的节点属性表中节点B的
Attribute为空值,不在你给出的uni_val范围内,映射后会得到NaN值,后续绘图时也会触发颜色解析错误。
修复方案
最简修复(仅修改原有代码的报错部分)
先补充缺失属性值的处理逻辑,再将颜色值转换为列表即可:
# 填充缺失的Attribute值,可根据自身需求调整填充值 df2['Attribute'] = df2['Attribute'].fillna(0) # 原有逻辑不变,仅修改nx.draw的node_color参数,将dict_values转为列表 nx.draw(G, node_color=list(nx.get_node_attributes(G, 'colour').values()), with_labels=True) plt.show()
优化版代码(简化冗余的颜色映射逻辑)
不需要手动循环生成颜色映射字典,可直接通过归一化工具批量生成对应颜色,代码更易维护:
import numpy as np import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 1. 处理属性表缺失值 df2['Attribute'] = df2['Attribute'].fillna(0) uni_val = df2.Attribute.unique() # 2. 构建网络 G = nx.from_pandas_edgelist(df1, source='Node', target='Edge') # 3. 按图的节点顺序提取属性值,直接映射颜色 node_attr_list = [df2.loc[df2['Nodes'] == node, 'Attribute'].iloc[0] for node in G.nodes()] norm = plt.Normalize(min(uni_val), max(uni_val)) node_colors = plt.cm.jet(norm(node_attr_list)) # 4. 绘图 nx.draw(G, node_color=node_colors, with_labels=True) plt.show()
内容的提问来源于stack exchange,提问作者LdM
相关产品推荐
相关产品推荐

