如何无需新建GeoDataFrame绘制GeoPandas数据框的质心
问题
作为GeoPandas新手,我有一个包含县名与geometry字段的GeoDataFrame,想要绘制县地图,并在各县质心处标注县名和面积。目前我通过为每个要绘制的信息(比如面积、质心坐标)新建GeoDataFrame来实现,但这种方法太繁琐。尝试直接计算质心并绘制的方式失败了,想知道更优的分层绘图方法,能不能像拼接马赛克一样逐层添加图层,最后统一绘制?
现有代码:
fig, ax = plt.subplots(figsize=(12, 12)) # 绘制县界 counties.plot(ax=ax , color='steelblue', edgecolor='#6a6a6a', linewidth=2 , alpha =0.5 , kind="geo") # 绘制质心红点 ## 方法1:可行但需要新建质心GeoDataFrame county_centroids.plot(ax=ax , color='red', marker='o', markersize=5 ) ## 方法2:无效。尝试直接计算质心并即时绘制 counties.plot(ax=ax, color ="red", marker="o", markersize=6 , x=counties.geometry.x , y =counties.geometry.y , kind = "scatter")
最优分层绘图方案
完全可以通过在原GeoDataFrame中直接衍生字段,然后逐层叠加绘图的方式实现,不需要新建多个GeoDataFrame,步骤如下:
- 提前计算所需字段:直接在原
counties中添加质心坐标列和面积列,避免重复计算 - 分层绘制图层:按顺序绘制县界底图、质心点、标注文字,所有图层共用同一个
ax对象
完整实现代码
import geopandas as gpd import matplotlib.pyplot as plt # 假设counties是已加载的目标GeoDataFrame # 1. 计算质心坐标和面积,直接添加到原GDF counties['centroid_x'] = counties.geometry.centroid.x counties['centroid_y'] = counties.geometry.centroid.y # 如需平方公里单位,可转换为:counties.geometry.area / 10**6 counties['area'] = counties.geometry.area # 2. 创建画布和轴对象 fig, ax = plt.subplots(figsize=(12, 12)) # 第一层:绘制县界底图 counties.plot( ax=ax, color='steelblue', edgecolor='#6a6a6a', linewidth=2, alpha=0.5 ) # 第二层:绘制质心红点(直接用原GDF的衍生字段做散点图) counties.plot( ax=ax, kind='scatter', x='centroid_x', y='centroid_y', color='red', marker='o', markersize=5 ) # 第三层:标注县名和面积 for idx, row in counties.iterrows(): ax.text( row['centroid_x'], row['centroid_y'], # 替换成你的县名字段,比如row['name'] f"{row['县名字段']}\n面积: {row['area']:.2f}", fontsize=8, ha='center', va='center' ) # 隐藏坐标轴,优化地图视觉效果 ax.set_axis_off() plt.show()
关键说明
- 无需新建多个GeoDataFrame:所有衍生数据(质心、面积)都存在原GDF中,减少冗余
- 图层叠加逻辑:后绘制的图层会覆盖在前一层之上,按「底图→点→文字」的顺序符合视觉逻辑
- 方法2失败原因:直接用
counties.geometry.x和counties.geometry.y取的是要素的边界x/y,不是质心;且scatter模式需要指定GDF中的列名,而非直接传入Series,提前生成centroid_x/centroid_y列即可正常使用
内容的提问来源于stack exchange,提问作者coredump
相关产品推荐
相关产品推荐

