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

Cartopy绘图如何裁剪画布外网格线、等高线与海岸线

问题根源
  • Cartopy绘制矢量地图时默认不会裁剪超出地图显示范围的要素:网格线、等高线、海岸线这类矢量路径只要有一段落在显示区内,整条路径都会被完整写入EPS文件。这些溢出的路径在预览时被轴边界挡住看不见,但会撑大EPS文件的边界框,插到LaTeX里就会出现多余的宽边距,现象如下图:
    轴边界外延伸线条的子图示例
  • 代码中同时开启constrained_layout自动布局,又手动调用subplots_adjust调整色条位置,两个布局逻辑冲突,也会加重边距异常。
修复步骤

1. 移除冲突的自动布局参数

你需要手动控制子图间距和共享色条位置,直接删掉figure初始化时的constrained_layout=True即可,避免自动布局和手动调整互相干扰:

# 原代码
# fig = plt.figure(figsize=(12, 9), constrained_layout=True)
# 修改为
fig = plt.figure(figsize=(12, 9))

2. 开启全局边界裁剪,彻底清除范围外线条

在ax.set_extent()设置完地图显示范围后,添加如下代码,将所有绘图要素严格裁剪到地图边界内,超出部分不会再写入矢量文件:

ax.set_extent([-35, 30, 25, 70])   # 原有代码保留
# 新增以下裁剪代码,兼容新旧版本Cartopy
try:
    map_boundary = ax.outline_patch
except AttributeError:
    # Cartopy 0.18及以上版本用spines['geo']获取地图边界
    map_boundary = ax.spines['geo']
ax.set_clip_path(map_boundary)

这段代码对网格线、等高线、填色图层、海岸线全部生效,不需要单独给每个绘图函数加参数。

3. (可选)旧版本兼容兜底

如果你用的Cartopy版本较老,部分网格线仍有溢出,可以在绘图函数return前加一段遍历,强制所有元素遵循裁剪规则:

for artist in ax.get_children():
    artist.set_clip_path(map_boundary)
注意事项
  • 不需要使用tight_layout,也不要在保存EPS时加bbox_inches='tight'参数:前者和手动设置的色条位置冲突,后者会打乱你预设的子图、色条坐标。
  • 原代码中contour函数的extent='both'参数不具备裁剪作用,可以直接删除,不影响绘图结果。
  • 修改后重新导出的EPS文件在Adobe Illustrator中查看,轴边界外不会再有多余线条,插入LaTeX后的边距和Matplotlib中预览的效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:36:08