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

如何在带栅格图的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:16:10