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
相关产品推荐
相关产品推荐

