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

如何无需新建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,步骤如下:

  1. 提前计算所需字段:直接在原counties中添加质心坐标列和面积列,避免重复计算
  2. 分层绘制图层:按顺序绘制县界底图、质心点、标注文字,所有图层共用同一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:13:37