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

使用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不具备该能力。

解决步骤
  1. 确认数据的地理几何信息
    检查pro是否包含存储地理图形(如行政区多边形、点位)的列,常规列名为geometry。如果没有,需要将普通DataFrame与地理数据源(如shapefile、GeoJSON)合并,或通过经纬度列生成几何数据。

  2. 将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="用于匹配的列名")
    
  3. 验证转换结果
    执行以下代码确认转换成功:

    print(type(pro))  # 输出应为 <class 'geopandas.geodataframe.GeoDataFrame'>
    print(pro.total_bounds)  # 正常输出地理范围的四至坐标
    
  4. 调整绘图代码
    确保传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:45:46