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

