osmnx.plot_graph边缘颜色分配规则及OSM公路标签着色方法
OSMNX plot_graph函数边缘颜色分配规则及highway标签配色方案
边缘颜色分配核心规则
ox.plot_graph的edge_color参数遵循以下匹配逻辑:
- 传入单个颜色值时,所有路网边缘统一使用该颜色渲染
- 传入颜色列表时,列表顺序与图的边序列顺序一一对应,第N个列表值对应第N条边的渲染颜色,列表长度必须与图的总边数完全相等,否则会出现颜色分配错乱,这也是实测和教程结果不符的最常见原因:不同区域下载的OSM路网边的数量、排序都和教程示例不一致,直接套用教程的固定长度颜色列表必然会匹配错误
按OpenStreetMap的highway标签自定义配色方案
你可以通过手动映射highway属性的方式生成符合顺序要求的颜色列表,步骤如下:
- 首先定义不同highway类型对应的自定义颜色映射
road_color_map = { "motorway": "#e31a1c", "trunk": "#fd8d3c", "primary": "#fecc5c", "secondary": "#ffffb2", "tertiary": "#addd8e", "residential": "#4d4d4d", "unclassified": "#737373", "footway": "#969696", "cycleway": "#7fcdbb" }
- 处理路网边的highway属性,避免部分属性为列表的情况导致匹配失败
# 提取路网的边GeoDataFrame edges_gdf = ox.graph_to_gdfs(gdf, nodes=False) # 统一highway属性格式:如果是列表则取第一个值 edges_gdf["highway"] = edges_gdf["highway"].apply(lambda x: x[0] if isinstance(x, list) else x)
- 生成与边顺序完全匹配的颜色列表
# 按映射匹配颜色,未匹配到的道路类型统一设置为浅灰色 edges_gdf["edge_color"] = edges_gdf["highway"].map(road_color_map).fillna("#d9d9d9") roadColors = edges_gdf["edge_color"].tolist()
- 调用plot_graph时传入生成的roadColors参数即可,和你现有代码逻辑一致
fig, ax = ox.plot_graph(gdf, node_size=0, bbox = (north, south, east, west),figsize=(height, width), dpi = 96,bgcolor = bgcolor, save = False, edge_color=roadColors, edge_linewidth=roadWidths, edge_alpha=1)
get_edge_colors_by_attr函数作用说明
该函数适用于按数值类边属性生成渐变色配色的场景,比如按道路长度、限速等连续数值分配色阶,函数会自动根据属性值的分布计算对应颜色,返回的结果就是和边顺序匹配的颜色列表,可直接传入edge_color参数使用。
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

