如何在Matplotlib子图中添加Cartopy海岸线并匹配图像范围?
问题解决:给Matplotlib子图添加Cartopy海岸线
问题根源
你的代码里存在核心错误:你用plt.axes(projection=ccrs.PlateCarree())新建了一个独立的坐标轴,而非操作plt.subplots()生成的子图数组axarr里的轴。这导致海岸线只显示在这个额外的轴上,你需要的16个子图完全没有应用范围设置和海岸线。
修正后的代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs img_extent = (lon.min(), lon.max(), lat.min(), lat.max()) # 创建带PlateCarree投影的子图数组 fig, axarr = plt.subplots(nrows=4, ncols=4, subplot_kw={'projection': ccrs.PlateCarree()}, figsize=(16,14)) # 整理待绘制的数据集与对应索引,减少重复代码 plot_data = [ (first_lag, 0), (first_lag, 12), (first_lag, 24), (first_lag, 36), (second_lag, 0), (second_lag, 12), (second_lag, 24), (second_lag, 36), (third_lag, 0), (third_lag, 12), (third_lag, 24), (third_lag, 36), (third_lag, 0), (third_lag, 12), (third_lag, 24), (third_lag, 36) ] # 遍历所有子图,批量设置范围、添加海岸线并绘制图像 for ax, (data, idx) in zip(axarr.flat, plot_data): # 设置子图显示范围,匹配图像的经纬度边界 ax.set_extent(img_extent, crs=ccrs.PlateCarree()) # 添加10m分辨率的波多黎各海岸线 ax.coastlines('10m', linewidth=1.5, color='black') # 绘制图像 im = ax.imshow(data[idx], vmin=0, vmax=1000, cmap='viridis', extent=img_extent, transform=ccrs.PlateCarree()) # 添加网格线(按需保留) gl = ax.gridlines(color="white", alpha=0.4, linestyle="dotted", draw_labels=True, dms=True, x_inline=False, y_inline=False) gl.top_labels = False gl.right_labels = False # 添加全局统一色条(可选,可调整shrink参数适配布局) fig.colorbar(im, ax=axarr, shrink=0.8) plt.tight_layout() plt.show()
关键修改说明
- 移除冗余坐标轴:删掉
ax = plt.axes(projection=ccrs.PlateCarree())语句,直接操作axarr中的子图轴。 - 批量处理子图:通过
axarr.flat扁平化子图数组,配合循环批量完成范围设置、海岸线添加和图像绘制,避免重复代码。 - 统一色条设置:用
fig.colorbar给所有子图添加统一色条,提升可视化一致性。
额外提示
确保img_extent中的经纬度范围精准对应波多黎各区域,这样海岸线会完全匹配你的图像边界。
内容的提问来源于stack exchange,提问作者techsense
相关产品推荐
相关产品推荐

