如何在带栅格图的Plotly choropleth_mapbox上叠加矢量图层?
问题原因及解决办法
错误原因
- 调用
fig.add_choroplethmapbox触发序列化错误:Plotly的这个方法不会自动将GeoPandas的Shapely几何对象(比如Polygon)转换成JSON可序列化格式,但直接用GeoDataFrame创建choropleth_mapbox时,底层会自动完成GeoJSON转换,所以直接传原生几何对象就会报错。 - 使用
add_trace(go.Choropleth(...))图表为空:go.Choropleth是为常规非Mapbox的 choropleth 图表设计的,不兼容Mapbox的图层体系,添加后无法在Mapbox基础图上显示。
可行解决方案
方案1:将GeoDataFrame转为GeoJSON后用add_choroplethmapbox添加
手动把GeoDataFrame转成GeoJSON字符串,再传给方法的geojson参数,同时指定匹配的标识列:
import plotly.graph_objects as go import geopandas as gpd # 假设已创建基础栅格地图fig,以及矢量图层的GeoDataFrame gdf # 转换为GeoJSON字符串 geojson_str = gdf.to_json() # 添加矢量图层 fig.add_choroplethmapbox( geojson=geojson_str, locations=gdf['id'], # 替换为你的唯一标识列(如ID、名称) featureidkey="properties.id", # 对应GeoJSON属性中的标识字段 z=gdf['value'], # 用于着色的数值列 colorscale="Viridis", opacity=0.6, name="矢量图层" )
方案2:添加go.Choroplethmapbox类型的trace
要用带mapbox后缀的Choropleth对象,同样依赖GeoJSON转换:
import plotly.graph_objects as go import geopandas as gpd # 构造Mapbox兼容的矢量图层trace vector_trace = go.Choroplethmapbox( geojson=gdf.to_json(), locations=gdf['id'], featureidkey="properties.id", z=gdf['value'], colorscale="Plasma", opacity=0.5, name="矢量图层" ) # 添加到基础图 fig.add_trace(vector_trace)
方案3:用Plotly Express生成trace后添加
Plotly Express会自动处理GeoDataFrame到GeoJSON的转换,更省心:
import plotly.express as px import geopandas as gpd # 用px生成矢量图层的图表 vector_fig = px.choropleth_mapbox( gdf, geojson=gdf.geometry, locations=gdf.index, # 或用唯一标识列 z=gdf['value'], opacity=0.5, colorscale="Cividis" ) # 提取trace添加到基础栅格图 fig.add_trace(vector_fig.data[0])
内容的提问来源于stack exchange,提问作者ciskoh
相关产品推荐
相关产品推荐

