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

如何完全移除Matplotlib中三个Cartopy子图的水平间距?

消除Cartopy投影子图间的水平间距

你的问题核心在于Cartopy投影轴会强制保持固定纵横比,普通的tight_layout、subplots_adjust(wspace=0)等方法无法突破这个限制,导致子图间始终存在间距。以下是两种可行的解决方案:

方案一:结合Constrained Layout与边框隐藏

利用constrained_layout=True让Matplotlib自动适配投影轴的布局,同时隐藏相邻子图的边框和冗余刻度,实现视觉上的无缝衔接:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

fig, axes = plt.subplots(1, 3, figsize=(20, 8), 
                         subplot_kw={"projection": ccrs.EuroPP()}, 
                         dpi=300,
                         constrained_layout=True,
                         gridspec_kw={'wspace': 0, 'hspace': 0})

# 统一配置子图基础要素
for ax in axes:
    ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5)
    ax.coastlines(resolution='10m', lw=0.5)
    # 隐藏刻度,减少额外间距
    ax.set_xticks([])
    ax.set_yticks([])

# 第一个子图:隐藏右侧边框
for name, group in imp_1_days.groupby(['drivers'], sort=False):
    axes[0].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")
axes[0].spines['right'].set_visible(False)

# 第二个子图:隐藏左右边框
for name, group in imp_7_days.groupby(['drivers'], sort=False):
    axes[1].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")
axes[1].spines['left'].set_visible(False)
axes[1].spines['right'].set_visible(False)

# 第三个子图:隐藏左侧边框
for name, group in imp_30_days.groupby(['drivers'], sort=False):
    axes[2].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")
axes[2].spines['left'].set_visible(False)

plt.show()

方案二:手动设置轴位置(精确控制)

直接通过set_position()指定每个子图的位置参数,完全消除间距,适用于需要绝对布局的场景:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

fig, axes = plt.subplots(1, 3, figsize=(20, 8), 
                         subplot_kw={"projection": ccrs.EuroPP()}, 
                         dpi=300)

# 统一配置子图基础要素
for ax in axes:
    ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5)
    ax.coastlines(resolution='10m', lw=0.5)
    ax.set_xticks([])
    ax.set_yticks([])

# 手动设置轴位置:[left, bottom, width, height]
# 三个轴宽度一致,左右无缝衔接(可根据figsize微调数值)
axes[0].set_position([0.05, 0.1, 0.3, 0.8])
axes[1].set_position([0.35, 0.1, 0.3, 0.8])
axes[2].set_position([0.65, 0.1, 0.3, 0.8])

# 绘制散点图
for name, group in imp_1_days.groupby(['drivers'], sort=False):
    axes[0].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")
for name, group in imp_7_days.groupby(['drivers'], sort=False):
    axes[1].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")
for name, group in imp_30_days.groupby(['drivers'], sort=False):
    axes[2].scatter(group['Longitude'], group['Latitude'], 
                    c=group['color'], alpha=0.75, 
                    transform=ccrs.PlateCarree(), edgecolor="black")

# 隐藏相邻边框
axes[0].spines['right'].set_visible(False)
axes[1].spines['left'].set_visible(False)
axes[1].spines['right'].set_visible(False)
axes[2].spines['left'].set_visible(False)

plt.show()

关键说明

  1. Cartopy投影轴的固定纵横比是核心限制,普通间距调整方法无法覆盖这个特性;
  2. 隐藏相邻子图的边框可以避免边框重叠导致的视觉间隙;
  3. 手动布局时,需根据figsize微调left和width参数,确保子图完全贴合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:15:43