使用Matplotlib绘制国家GeoDataFrame时,如何正确对比国家面积?
解决Matplotlib子图中地理区域面积失真问题
问题背景
绘制加纳、肯尼亚、津巴布韦三个国家的子图时,出现面积失真:肯尼亚实际面积远大于另外两国,但子图中显示大小相近。尝试修改CRS为区域坐标系、设置set_aspect('equal')后问题仍未解决。
核心原因
默认的WGS84(EPSG:4326)经纬度投影不是等面积投影,直接绘制会导致面积比例失真;同时子图未统一采用等面积投影,且坐标轴比例未正确约束。
解决方案
采用等面积投影转换地理数据,同时确保子图坐标轴比例一致、自动适配边界范围。
修改后的代码
import geopandas as gpd import matplotlib.pyplot as plt strCountries = ["ghana", "kenya", "zimbabwe"] admin1Countries = [] # 选用非洲统一等面积投影(ESRI:102022),保证跨国家面积比例准确 target_crs = "ESRI:102022" for country in strCountries: regions = gpd.read_file(f"../data/admin1{country}.geojson") # 将数据转换到等面积投影坐标系 regions = regions.to_crs(target_crs) admin1Countries.append(regions) # 单图验证真实面积比例 fig, ax = plt.subplots() for regions in admin1Countries: regions.plot(ax=ax) ax.set_aspect('equal') plt.show() # 子图绘制,保证面积比例正确 fig, axs = plt.subplots(1, 3, figsize=(15, 5)) for i, regions in enumerate(admin1Countries): regions.plot(ax=axs[i]) axs[i].set_title(strCountries[i].capitalize()) # 强制坐标轴等比例,避免图形拉伸 axs[i].set_aspect('equal') axs[i].set_axis_off() # 自动适配国家边界,优化显示范围 axs[i].autoscale() plt.tight_layout() plt.show()
关键说明
- 等面积投影的选择:
- 跨国家场景推荐用非洲统一等面积投影
ESRI:102022,保证不同国家间面积比例准确; - 若需更精准的单国家投影,可替换为各国专属等面积CRS:
- 加纳:
EPSG:2136 - 肯尼亚:
EPSG:21037 - 津巴布韦:
EPSG:20935
- 加纳:
- 跨国家场景推荐用非洲统一等面积投影
set_aspect('equal'):必须设置,确保子图的x/y轴比例一致,避免图形被拉伸或压缩;autoscale():自动适配每个国家的边界范围,无需手动设置坐标轴范围,保证国家图形在子图中合理显示。
内容的提问来源于stack exchange,提问作者Ignacio
相关产品推荐
相关产品推荐

