使用geoplot绘制choropleth时遇AttributeError:DataFrame无total_bounds属性
问题原因
错误AttributeError: 'DataFrame' object has no attribute 'total_bounds'的核心原因是你传入gplt.choropleth()的pro是普通pandas DataFrame,而total_bounds是GeoPandas GeoDataFrame特有的属性——geoplot依赖GeoDataFrame识别地理几何信息、自动设置地图范围,普通DataFrame不具备该能力。
解决步骤
确认数据的地理几何信息
检查pro是否包含存储地理图形(如行政区多边形、点位)的列,常规列名为geometry。如果没有,需要将普通DataFrame与地理数据源(如shapefile、GeoJSON)合并,或通过经纬度列生成几何数据。将DataFrame转换为GeoDataFrame
根据数据类型选择转换方式:# 情况1:已有经纬度列(如lon、lat),生成点几何 pro = gpd.GeoDataFrame( pro, geometry=gpd.points_from_xy(pro.lon, pro.lat), crs="EPSG:4326" # 坐标系一般设为WGS84(EPSG:4326),按需调整 ) # 情况2:需合并外部地理数据(如行政区shapefile) # 先读取地理数据为GeoDataFrame # geo_shp = gpd.read_file("你的行政区文件.shp") # 按共同字段合并 # pro = pro.merge(geo_shp, on="用于匹配的列名")验证转换结果
执行以下代码确认转换成功:print(type(pro)) # 输出应为 <class 'geopandas.geodataframe.GeoDataFrame'> print(pro.total_bounds) # 正常输出地理范围的四至坐标调整绘图代码
确保传入gplt.choropleth()的是GeoDataFrame,若用cartopy投影,建议保持axes与绘图参数的投影一致:fig, ax = plt.subplots(1, 1, figsize=(12, 10), subplot_kw={'projection': ccrs.PlateCarree()}) scheme = mc.EqualInterval(pro['total'], k=10) gplt.choropleth( pro, hue="total", linewidth=.2, cmap='inferno_r', scheme=scheme, legend=True, edgecolor='black', ax=ax, projection=ccrs.PlateCarree() ) ax.set_title('CAD CDC hospitalization', fontsize=13) plt.show()
额外排查点
- 若已转换为GeoDataFrame仍报错,检查是否在后续操作中用
pd.DataFrame()将其重新转为普通DataFrame; - 执行
pro.geometry.isna().sum()查看几何列是否有缺失值,缺失的几何数据会导致geoplot无法识别地理范围。
内容的提问来源于stack exchange,提问作者Jahrakal
相关产品推荐
相关产品推荐

