之前,实现过相同的需求。将投影地图与非投影的折线图进行高度的对比。是通过手动设置add_axes()实现的,当时只是一个变量。
最近有需求需要处理多数据,发现不太好用了。这里发现一个官网的实力函数,使用可定位坐标轴将直方图与散点图对齐:make_axes_locatable为了使主轴与边距完美对齐,轴的位置由一个定义Divider实现。Divider API 允许以英寸为单位设置轴的大小和间距,这是其主要功能。
这里使用ICON三个不同分辨率的降水数据来进行展示,绘制其气候态空间分布图以及经向平均的演变示意图

import xarray as xrimport numpy as npimport matplotlib.pyplot as pltimport cartopy.crs as ccrsimport cartopy.feature as cfeatureimport pandas as pdfrom pathlib import Pathimport osimport matplotlib.ticker as mtickerfrom cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatterimport warningswarnings.filterwarnings("ignore", category=FutureWarning)from matplotlib.colors import ListedColormapmyCmap = ListedColormap(['#FFFFFF','#f7fbff','#e3eef9','#d0e1f2','#b7d4ea','#94c4df','#6aaed6','#4a98c9','#2e7ebc','#1764ab','#084a91','#08306b']) myCmapfrom mpl_toolkits.axes_grid1 import make_axes_locatabletitles = ["R02B07_CNTL", "R02B08_CNTL", "R02B09_CNTL"]fig = plt.figure(figsize=(11, 15), dpi=100, facecolor="white", constrained_layout=False)for i, path in enumerate(sorted(combined_ds.data_vars)): ax = fig.add_subplot(len(combined_ds.data_vars), 1, i + 1, projection=ccrs.PlateCarree(180)) pr_data = combined_ds[path] quadmesh = pr_data.plot( ax=ax, cmap=myCmap,# levels=np.arange(0, 16.5, 0.5), vmin=0, vmax=12, add_colorbar=False, transform=ccrs.PlateCarree(), ) ax.set_title(f"Precipitation from {titles[i]}", loc='left', fontsize=16) ax.coastlines(color='gray', linewidth=1, alpha=0.8) ax.set_xticks(np.arange(0, 361, 60), crs=ccrs.PlateCarree()) ax.set_yticks(np.arange(-90, 91, 30), crs=ccrs.PlateCarree()) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) ax.xaxis.set_major_locator(mticker.MultipleLocator(60)) ax.xaxis.set_minor_locator(mticker.AutoMinorLocator(4)) ax.hlines(0, -180, 180, color='k', linestyle='--', linewidth=1.5) ax.set_xlabel('Longitude') ax.set_ylabel('Latitude') divider = make_axes_locatable(ax) ax2 = divider.append_axes("right", size="16%", pad=0.12, axes_class=plt.Axes) meridional_mean = pr_data.mean(dim='lon') ax2.plot(meridional_mean.values, meridional_mean['lat'].values, color='k', linewidth=1.6) ax2.set_xlim(0, 10) ax2.set_ylim(ax.get_ylim()) ax2.axhline(0, color='k', linestyle='--', linewidth=1) ax2.tick_params(axis='y', left=False, labelleft=False) ax2.set_xlabel('mm/day') ax2.set_facecolor('none') ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) cax = divider.append_axes("right", size="3%", pad=0.06, axes_class=plt.Axes) fig.colorbar(quadmesh, cax=cax, label='Precipitation (mm/day)')fig.tight_layout()plt.show()★https://matplotlib.org/stable/gallery/axes_grid1/scatter_hist_locatable_axes.html