使用GeoPandas数据框绘制Plotly Mapbox Choropleth地图报错如何解决
问题原因与修复方案
错误原因
- 最直接的报错诱因:
px.choropleth_mapbox()本身返回的是完整的Figure对象,你将其套入列表后传给go.Figure()的data参数,属于传入非法值,data参数仅接受trace类型对象组成的列表,不支持嵌套Figure对象。 - GeoJSON参数格式不匹配:
px.choropleth_mapbox的geojson参数要求传入标准GeoJSON规范的特征集合(FeatureCollection),直接传入GeoPandas的df.geometry列无法被正确解析,且需要保证GeoJSON中每个特征的id和你传入的locations值一一对应。 - 参数名书写错误:调用
go.Figure时传入的参数名Layout首字母大写,正确参数名应为小写的layout。
修复代码
首先先将GeoDataFrame转换为符合要求的GeoJSON结构:
import json # 转换为标准GeoJSON geojson_data = json.loads(df.to_json()) # 为每个特征绑定对应id,和df的id列匹配 for idx, feature in enumerate(geojson_data["features"]): feature["id"] = df["id"].iloc[idx]
更简洁的修复方案(推荐):直接使用px生成图形后更新布局
import plotly.express as px fig = px.choropleth_mapbox( df, geojson=geojson_data, locations="id", # 直接传入列名即可,无需传入df['id'] color="cnt", color_continuous_scale="Viridis" ) # 更新布局配置 fig.update_layout( title="ch", mapbox_accesstoken=mapToken, width=1600, height=1200, mapbox={ "style": "streets", "zoom": 10.5, "center": { "lat": boundingBox["centroid_lat"].values[0], "lon": boundingBox["centroid_lon"].values[0] } } ) fig.show()
保留手动拼接Figure逻辑的修复方案
import plotly.graph_objects as go import plotly.offline as plyoff # 仅提取px生成的trace部分 trcs = px.choropleth_mapbox( df, geojson=geojson_data, locations="id", color="cnt", color_continuous_scale="Viridis" ).data lout = go.Layout( title="ch", mapbox_accesstoken=mapToken, width=1600, height=1200, mapbox={ "style": "streets", "zoom": 10.5, "center": { "lat": boundingBox["centroid_lat"].values[0], "lon": boundingBox["centroid_lon"].values[0] } } ) # 参数名改为小写layout plyoff.iplot(go.Figure(data=trcs, layout=lout))
内容的提问来源于stack exchange,提问作者Dr. Andrew
相关产品推荐
相关产品推荐

