如何完全移除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()
关键说明
- Cartopy投影轴的固定纵横比是核心限制,普通间距调整方法无法覆盖这个特性;
- 隐藏相邻子图的边框可以避免边框重叠导致的视觉间隙;
- 手动布局时,需根据
figsize微调left和width参数,确保子图完全贴合。
内容的提问来源于stack exchange,提问作者zorals
相关产品推荐
相关产品推荐

