Plotly Choropleth(Dash场景):如何为GeoJSON中的指定区域添加轮廓高亮
Plotly Choropleth(Dash场景):如何为GeoJSON中的指定区域添加轮廓高亮
嘿,我刚好处理过一模一样的需求!要给你用Plotly画的Choropleth地图里的指定区域加高亮轮廓,其实核心思路就是在现有着色图层的基础上,叠加一个Scattergeo图层专门用来画高亮的轮廓线,完全适配你用Dash的场景,下面我结合你的代码一步步来:
第一步:从GeoJSON里提取目标区域的几何数据
首先你得从现有的my_geojson里把要高亮的那个区域的几何坐标捞出来,比如你想高亮STATE_2,可以这么写:
# 定义你要高亮的目标区域 target_state = "STATE_2" highlight_geometry = None # 遍历GeoJSON的features,匹配目标区域 for feature in my_geojson['features']: if feature['properties']['id'] == target_state: highlight_geometry = feature['geometry'] break
第二步:转换坐标格式适配Scattergeo
Plotly的Scattergeo需要的是单独的纬度和经度列表,而GeoJSON里的Polygon坐标是嵌套数组,所以我们要做个简单的格式转换:
# 处理Polygon类型的坐标(如果是MultiPolygon需要额外循环处理子区域) lon_list, lat_list = zip(*highlight_geometry['coordinates'][0])
第三步:叠加高亮轮廓图层到你的地图
接下来把这个轮廓图层加到你已经画好的base map上,这里可以自定义轮廓的颜色、粗细,完全按需调整:
# 先保留你原来的基础地图代码 fig = px.choropleth( df, geojson=my_geojson, color='value', locations='state', featureidkey='properties.id', projection='Mercator', ) fig.update_geos( fitbounds='locations', visible=False, ) fig.update_layout( coloraxis=dict( colorbar=dict( title='', orientation='h', ) ) ) # 叠加高亮轮廓 fig.add_scattergeo( lon=list(lon_list), lat=list(lat_list), mode='lines', line=dict(width=3, color='#FF0000'), # 比如用红色粗线条,自己改颜色和宽度 fill=None, # 只留轮廓,不要填充 showlegend=False, # 别让它出现在图例里 hoverinfo='skip' # 鼠标滑过也不显示信息,避免干扰原地图的hover效果 )
额外提示
- 如果要高亮多个区域,只需要循环遍历每个目标state,重复上面的提取坐标+添加Scattergeo图层的步骤就行
- 如果你的GeoJSON里有
MultiPolygon类型的区域,记得要遍历coordinates里的每个子Polygon,分别提取坐标后添加图层 - 在Dash里使用的话,和你原来的用法完全一样,直接把这个处理好的
fig传给dcc.Graph(figure=fig)就可以了
备注:内容来源于stack exchange,提问作者Samuel O.D.
相关产品推荐
相关产品推荐

