同一个图形上的normal和cartopy投影如何处理好?

How to deal well with normal and cartopy projection on the same figure?

我想制作这种图,取自Sallee等人。 (2021) 如果可能,直接来自 Python :

在主子图中有一个 Cartopy 投影 cartopy.crs.Robinson(central_longitude=0, globe=None),在它的右边有一些接近我在 Cartopy 投影上的值的密度函数(在纬度上)。使用 Robinson 投影管理标签对我来说并不方便,而使用 cartopy.crs.PlateCarree(central_longitude=0.0, globe=None) 我在标记轴时没有遇到任何问题。

这是我目前在堆栈上创建的最相关的主题 (combination of normal and cartopy subplots within the same figure),但这并没有敲响任何警钟,因为我的目标图有点复杂(颜色栏上方的大小罗宾逊投影,两条虚线 link 子图,标记经度和纬度)。

谢谢!

有没有什么具体的东西是您没能创造出来的? Cartopy/Matplotlib.

中可以轻松获得您要求的大部分内容

附加注释,例如 Matplotlib 可以使用内嵌缩放线,例如:
https://matplotlib.org/stable/gallery/subplots_axes_and_figures/zoom_inset_axes.html

但我个人会避免这种情况并简单地对齐轴以确保它们共享相同的纬度。对于试图解释数据的用户来说,这可能更直观。

一些随机数据的简单示例:

lats = np.linspace(90-6, -90+6, 15)
data = np.random.randn(15, 32)

proj = ccrs.Robinson(central_longitude=0, globe=None)

fig = plt.figure(figsize=(11, 5), dpi=86, facecolor="w")
spec = fig.add_gridspec(9, 5)

ax1 = fig.add_subplot(spec[1:, :4], projection=proj)
im = ax1.imshow(
    data, cmap="Blues", vmin=-3, vmax=3,
    extent=[-180, 180,90,-90], transform=ccrs.PlateCarree())

cax = fig.add_subplot(spec[0, 1:-2])
cb1 = fig.colorbar(im, cax=cax, orientation="horizontal")
cax.set_title("Something [-]")
cax.xaxis.set_ticks_position('top')

grd = ax1.gridlines(
    draw_labels=True, 
    xlocs=range(-180, 181, 90), 
    ylocs=range(-60, 61, 30), 
    color='k',
)
grd.top_labels = False

ax1.add_feature(cfeature.LAND, facecolor="#eeeeee", zorder=99)


ax2 = fig.add_subplot(spec[1:, -1])
ax2.plot(data.mean(axis=1), lats)
ax2.axvline(0, color="k", lw=1)
ax2.set_xlim(-0.5, 0.5)
ax2.set_yticks(range(-60, 61, 30))
ax2.yaxis.set_label_position("right")
ax2.yaxis.tick_right()
ax2.grid(axis="y")
ax2.set_ylabel("Latitude [deg]")