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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:21:00