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

绘制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()

关键注意事项

  1. 正确使用aspect参数:xarray的plot.imshow()支持aspect='equal'参数,不要误用plt.imshow的aspect参数——这是你之前报错的核心原因。
  2. 轴共享+手动锁范围:开启sharex=True和sharey=True后,手动设置轴范围可以防止Geopandas绘图时修改轴尺度。
  3. CRS必须匹配:矢量数据的坐标参考系必须和栅格一致,否则矢量会绘制到错误位置,也可能导致轴变形。
  4. 裁剪矢量显示:clip_on=True会让矢量仅显示在当前子图的轴范围内,避免超出栅格的矢量部分拉伸坐标轴。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:20:22