为何重组数据后GeoPandas的绘图类型发生变化?
问题原因
你遇到的核心问题是:ireland_sales_summed不再是GeoDataFrame,而是普通的pandas DataFrame,导致调用plot()时触发的是pandas默认的折线图绘制逻辑,而非geopandas的地理绘图逻辑。
具体来说:
- 通过
groupby('County').sum()得到的ireland_vol_total是普通DataFrame(丢失了geometry地理列)。 - 用这个普通DataFrame和GeoDataFrame
ireland_sales合并后,结果会自动降级为普通DataFrame,不再保留GeoDataFrame的地理属性。 - pandas的
plot()方法对带多列的DataFrame默认绘制折线图,这就是你看到异常图形的原因。
解决方案
推荐使用geopandas专门的**dissolve()**方法来聚合地理数据,它会自动保留地理信息,同时完成数值列的聚合,避免数据类型降级。
方式一:用dissolve替代groupby+merge(推荐)
替换代码中从ireland_vol_total = ...到ireland_sales_summed = ...的部分:
# 用dissolve聚合:按County分组,求和Volume,保留geometry和其他需要的列 ireland_sales_summed = ireland_sales.dissolve( by='County', aggfunc={ 'Volume': 'sum', 'AREA': 'first' # 保留AREA列的第一个值,根据需求调整 } ).rename(columns={'Volume': 'County Volume Total'}) # 确保无销售数据的郡数值为0 ireland_sales_summed['County Volume Total'] = ireland_sales_summed['County Volume Total'].fillna(0)
dissolve()会直接返回GeoDataFrame,保留每个County对应的地理形状,调用plot()时自然会绘制 choropleth 地图。
方式二:手动恢复GeoDataFrame类型
如果坚持使用原有的groupby+merge流程,只需在合并后将数据重新转为GeoDataFrame:
# 原groupby和合并代码不变,最后添加这一步 ireland_sales_summed = gpd.GeoDataFrame( ireland_sales_summed, geometry='geometry', # 指定地理列 crs=ireland_sales.crs # 继承原数据的坐标系 )
修改后完整的绘图代码
fig, ax = plt.subplots(1, 1) fig.set_size_inches(10,10) # 绘制聚合后的 choropleth 地图 ireland_sales_summed.plot(ax=ax, column='County Volume Total', cmap='Blues', legend=True) ax.set_axis_off() plt.show()
额外优化建议
- 处理shapefile合并时,County列生成逻辑可以简化:
ireland['County'] = ireland['COUNTY'].combine_first(ireland['CountyName']),替代循环更高效。 - 后续制作气泡图时,可通过
geometry.centroid获取郡的中心点,再绘制大小对应销量的散点。
内容的提问来源于stack exchange,提问作者Nick Seymour
相关产品推荐
相关产品推荐

