绘制xarray卫星影像与Geopandas矢量边界时纵横比异常
解决并排子图添加矢量后y轴尺寸不一致的问题
问题原因
在xarray绘制的栅格子图上叠加Geopandas矢量时,Geopandas的plot()方法可能自动调整坐标轴范围或比例,导致叠加矢量的子图与纯栅格子图的轴尺寸不匹配——尤其当矢量范围和栅格不完全重合时,这种偏移会更明显。
解决方案
通过固定轴范围、统一绘图参数并限制矢量显示范围来解决,具体代码示例如下:
import matplotlib.pyplot as plt import rioxarray import geopandas as gpd # 加载数据(替换为你的文件路径) raster_clip = rioxarray.open_rasterio("clipped_raster.tif") ag_clip = gpd.read_file("clipped_vectors.shp") # 确保矢量与栅格坐标参考系(CRS)一致 ag_clip = ag_clip.to_crs(raster_clip.rio.crs) # 创建并排子图,开启轴共享 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6), sharex=True, sharey=True) # 绘制第一张纯栅格子图,指定aspect='equal'(xarray绘图接口原生支持该参数) raster_clip.plot.imshow(ax=ax1, aspect='equal') ax1.set_title("原始卫星影像") # 绘制第二张栅格子图,保持比例一致 raster_clip.plot.imshow(ax=ax2, aspect='equal') # 叠加矢量,开启clip_on=True让矢量仅显示在栅格范围内,避免拉伸坐标轴 ag_clip.plot(ax=ax2, facecolor='none', edgecolor='red', linewidth=1, clip_on=True) ax2.set_title("叠加农田边界的卫星影像") # 强制同步两个子图的轴范围,彻底避免轴偏移 x_min, x_max = raster_clip.x.min().item(), raster_clip.x.max().item() y_min, y_max = raster_clip.y.min().item(), raster_clip.y.max().item() ax1.set_xlim(x_min, x_max) ax1.set_ylim(y_min, y_max) ax2.set_xlim(x_min, x_max) ax2.set_ylim(y_min, y_max) plt.tight_layout() plt.show()
关键注意事项
- 正确使用aspect参数:xarray的
plot.imshow()支持aspect='equal'参数,不要误用plt.imshow的aspect参数——这是你之前报错的核心原因。 - 轴共享+手动锁范围:开启
sharex=True和sharey=True后,手动设置轴范围可以防止Geopandas绘图时修改轴尺度。 - CRS必须匹配:矢量数据的坐标参考系必须和栅格一致,否则矢量会绘制到错误位置,也可能导致轴变形。
- 裁剪矢量显示:
clip_on=True会让矢量仅显示在当前子图的轴范围内,避免超出栅格的矢量部分拉伸坐标轴。
内容的提问来源于stack exchange,提问作者noaboa
相关产品推荐
相关产品推荐

