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

Geopandas绘制美国地图时annotate标注无法显示问题

Geopandas绘制美国地图时annotate标注不显示问题

问题表现

  • 代码运行无崩溃、无报错,但最终导出的地图文件中完全不展示标注内容
  • 测试使用的美国行政区划GPKG数据来自GADM官网
  • 最初怀疑问题与CRS投影坐标系有关,尝试手动输入坐标添加标注仍未得到预期效果

问题复现代码

import fiona
import geopandas
import matplotlib.pyplot as plt
from shapely.geometry import Polygon,box


countries_gdf = geopandas.read_file("geopkg/USA.gpkg",layer="ADM_1")
polygon = box(-130, -70, 0, 50)
countries_gdf = geopandas.clip(countries_gdf, polygon)

f = plt.figure()
ax = f.add_subplot()

all_states = countries_gdf.plot(facecolor="gray",edgecolor="black",linewidth=.15,rasterized=True)

tx = countries_gdf.query('HASC_1 == "US.TX" or HASC_1 == "US.MI"')
tx.plot(ax=all_states,rasterized=True)
tx.apply(lambda x: ax.annotate(text=x.NAME_1, xy=x.geometry.centroid.coords[0], ha='center'),axis=1)

plt.savefig("test3.png",dpi=500)

运行上述代码后导出的test3.png无任何标注内容,渲染效果如下:
无标注的美国地图渲染结果

问题原因

核心问题是坐标轴对象混用:
代码中先手动创建了ax = f.add_subplot(),但第一次调用countries_gdf.plot()时没有传入ax参数指定绘图坐标轴,该方法会自动创建新的独立画布与坐标轴,返回值all_states才是实际渲染地图的坐标轴对象。后续的annotate标注操作全部在最初创建的空白ax对象上执行,标注根本没有添加到地图所在的坐标轴上,自然不会在最终导出的地图中显示。
额外的小问题:代码中设置的裁切框box(-130, -70, 0, 50)范围不合理,会包含大量南半球的空白区域,但该问题不会导致标注消失。

修正方案

所有绘图、标注操作统一使用同一个坐标轴对象即可,修正后代码如下:

import geopandas
import matplotlib.pyplot as plt
from shapely.geometry import box

# 读取行政区划数据
countries_gdf = geopandas.read_file("geopkg/USA.gpkg", layer="ADM_1")
# 调整裁切范围为美国本土大致经纬度区间,减少无效空白
polygon = box(-130, 24, -66, 50)
countries_gdf = geopandas.clip(countries_gdf, polygon)

# 统一初始化画布与坐标轴
f, ax = plt.subplots(figsize=(10, 7))
# 绘制所有州底图,指定使用当前ax
countries_gdf.plot(
    ax=ax, 
    facecolor="gray", 
    edgecolor="black", 
    linewidth=.15, 
    rasterized=True
)

# 筛选目标州并高亮绘制
tx = countries_gdf.query('HASC_1 == "US.TX" or HASC_1 == "US.MI"')
tx.plot(ax=ax, rasterized=True)
# 标注同样添加到同一个ax对象上
tx.apply(
    lambda x: ax.annotate(
        text=x.NAME_1, 
        xy=x.geometry.centroid.coords[0], 
        ha='center',
        fontsize=10
    ),
    axis=1
)

# 保存时增加tight参数避免边缘内容被裁切
plt.savefig("test3_fixed.png", dpi=500, bbox_inches='tight')

补充排查点

如果修正后仍存在标注不显示的问题,可检查两项配置:

  • GADM下载的行政区划数据默认使用EPSG:4326(WGS84地理坐标系),centroid提取的经纬度坐标和裁切框的经纬度范围匹配,无需额外做投影转换
  • 若标注位置过于靠近画布边缘,可适当调整画布尺寸或标注偏移量,避免被保存时的裁切逻辑移除

内容的提问来源于stack exchange,提问作者Rim ManHa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:46:12