Search code examples
pythonmatplotlibcartopy

Plotting multiple Cartopy maps side-by-side using gridspec?


The goal is to produce a divided figure with one large Orthographic map on the left and twelve smaller EqualEarth projections on the right. This will eventually be animated, filled with data, etc. For now, the smallest example is below:

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

fig = plt.figure(figsize=(16,8), constrained_layout=True)
gs = fig.add_gridspec(1, 2)

ax0 = fig.add_subplot(gs[0,0])
ax0 = plt.axes(projection=ccrs.Orthographic())
ax0.coastlines(resolution='110m')

nrows = 4
ncols = 3

for i in range(nrows*ncols):
    ax1 = fig.add_subplot(nrows, ncols, i+1, projection=ccrs.EqualEarth())
    ax1.set_global()
    ax1.coastlines()

This produces this result:

Actual Result

The preferred result would look like this:

Preferred Result

How do I achieve this? It doesn't have to use gridspec, if there is a better way.

EDIT: success with the following code:

fig = plt.figure(figsize=(12, 5.5), constrained_layout=True)
gs0 = fig.add_gridspec(1, 2, width_ratios=[1, 2])

ax0 = fig.add_subplot(gs0[0], projection=ccrs.Orthographic())
ax0.coastlines()

gs01 = gs0[1].subgridspec(4, 3)

for a in range(4):
    for b in range(3):
        ax = fig.add_subplot(gs01[a, b], projection=ccrs.EqualEarth())

Solution

  • You basically want to do what is described here: https://matplotlib.org/tutorials/intermediate/gridspec.html#gridspec-using-subplotspec

    I didn't bother to download cartopy, but you get the idea...

    
    fig = plt.figure(constrained_layout=True)
    gs0 = fig.add_gridspec(1, 2, width_ratios=[1, 2])
    
    ax0 = fig.add_subplot(gs0[0])
    
    gs01 = gs0[1].subgridspec(4, 3)
    
    for a in range(4):
        for b in range(3):
           ax = fig.add_subplot(gs01[a, b])
    
    

    enter image description here