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

OSMnx节点按属性着色失败:ValueError报错求助

解决ox.plot.get_node_colors_by_attr()报错:ValueError: There are no attribute values

你遇到的这个错误其实很常见——核心原因是你把自定义属性r只加到了从图转换来的GeoDataFramenodes里,但并没有同步到图对象G_nx的节点属性中。ox.plot.get_node_colors_by_attr()是直接从图对象的节点属性里读取数据的,自然找不到r这个属性,所以抛出了这个报错。

修正后的完整代码

import networkx as nx
import numpy as np
import osmnx as ox
ox.config(use_cache=True, log_console=True)

city = 'Portugal, Lisbon'
G = ox.graph_from_place(city, network_type='drive', simplify=True)
G_nx = nx.relabel.convert_node_labels_to_integers(G)

# 直接给图对象的节点添加属性'r',这一步是关键
r_total = np.random.random(len(G_nx))
nx.set_node_attributes(G_nx, {node: r_total[node] for node in G_nx.nodes()}, 'r')

# 如果你需要查看或使用GeoDataFrame,再执行转换(可选)
nodes, edges = ox.graph_to_gdfs(G_nx, nodes=True, edges=True)

# 现在调用函数就能正常获取颜色了
nc = ox.plot.get_node_colors_by_attr(G_nx, attr='r')

为什么原代码不行?

原代码里的nodes['r'] = nodes.index.map(lambda x: r_total[x])只是修改了GeoDataFrame的列——这个GDF是图数据的副本,和G_nx本身的节点属性是完全分离的两个数据结构。而get_node_colors_by_attr()会遍历图G_nx的每个节点,尝试读取节点自身的r属性,所以必须把属性直接写入图的节点中,而不是只写在GDF里。

额外小技巧

上面用nx.set_node_attributes()批量添加属性的方式,比逐个循环节点更高效。如果你习惯用循环,也可以这么写:

for node in G_nx.nodes():
    G_nx.nodes[node]['r'] = r_total[node]

两种写法效果完全一致,选你顺手的就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:02:39