We often need to draw multiple similar maps using the same colorbar. A good way is to use the AxesGrid from the Cartopy package. Below is one of my examples of sharing colorbars for 4 submaps. This example can also answer other questions:
- How to add ocean, river, lakes,coastline and province border to a map?
- How to set the longitude and latitude extent of a map?
- How to format the colorbar of map?
- How to plot a grid map?
- How to set the maximum and minimum value for a map?
- How to add title to a map?
- How to set cmap for a map?
- How to save a figure to disk?
import sys import warnings if not sys.warnoptions: warnings.simplefilter('ignore') #Display data import cartopy import cartopy.crs as ccrs from cartopy.mpl.geoaxes import GeoAxes from cartopy.vector_transform import vector_scalar_to_grid from matplotlib.axes import Axes import cartopy.feature as cfeature from cartopy import config from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter from mpl_toolkits.axes_grid1 import AxesGrid import matplotlib.pyplot as pltIgnore other code for preparing data
projection = ccrs.PlateCarree() provinc_bodr = cartopy.feature.NaturalEarthFeature(category='cultural', name='admin_1_states_provinces_lines', scale='50m', facecolor='none', edgecolor='k') axes_class = (GeoAxes, dict(map_projection=projection)) fig = plt.figure(figsize=(15,15)) #!important, set the colarbar axgr = AxesGrid(fig, 111, axes_class=axes_class, nrows_ncols=(2, 2), #! important,set 2x2 maps axes_pad=0.6, cbar_location='right', cbar_mode='single', cbar_pad=0.2, cbar_size='3%', label_mode='') # note the empty labe #!plot the first sub map ax=axgr[0] #important,0,1,2,3 #************************************************************* #add ocean, coastline,borders,lakes,rivers,provinc_bodr ax.add_feature(cfeature.OCEAN) ax.add_feature(cfeature.COASTLINE,linewidth=0.3) ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5) ax.add_feature(cfeature.LAKES, alpha=0.3) ax.add_feature(cfeature.RIVERS) ax.add_feature(provinc_bodr, linestyle='-', linewidth=1, edgecolor="k", zorder=10, alpha=0.5) ax.set_title('(a) Risk (RCP2.6,2050s)',fontsize=18) ax.set_xticks(np.linspace(-100, -70, 5), crs=projection) ax.set_yticks(np.linspace(35, 65, 5), crs=projection) ax.set_xlim([-100,-70]) ax.set_ylim([35,65]) lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) p = ax.pcolormesh(X, Y, data1, vmin=-100000, #!important, all submaps should be same vmax=100000, #!important, all submaps should be same transform=projection, cmap='RdBu') #! Plot the second sub map ax=axgr[1] #************************************************************* #add ocean, coastline,borders,lakes,rivers,provinc_bodr ax.add_feature(cfeature.OCEAN) ax.add_feature(cfeature.COASTLINE,linewidth=0.3) ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5) ax.add_feature(cfeature.LAKES, alpha=0.3) ax.add_feature(cfeature.RIVERS) ax.add_feature(provinc_bodr, linestyle='-', linewidth=1, edgecolor="k", zorder=10, alpha=0.5) ax.set_title('(b) Risk (RCP2.6,2080s)',fontsize=18) ax.set_xticks(np.linspace(-100, -70, 5), crs=projection) ax.set_yticks(np.linspace(35, 65, 5), crs=projection) ax.set_xlim([-100,-70]) ax.set_ylim([35,65]) lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) p = ax.pcolormesh(X, Y, data2, vmin=-100000,#! important vmax=100000, #! important transform=projection, cmap='RdBu') #! Plot the third sub maps ax=axgr[2] #!important #************************************************************* #add ocean, coastline,borders,lakes,rivers,provinc_bodr ax.add_feature(cfeature.OCEAN) ax.add_feature(cfeature.COASTLINE,linewidth=0.3) ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5) ax.add_feature(cfeature.LAKES, alpha=0.3) ax.add_feature(cfeature.RIVERS) ax.add_feature(provinc_bodr, linestyle='-', linewidth=1, edgecolor="k", zorder=10, alpha=0.5) ax.set_title('(c) Risk (RCP6.0,2050s)',fontsize=18) ax.set_xticks(np.linspace(-100, -70, 5), crs=projection) ax.set_yticks(np.linspace(35, 65, 5), crs=projection) ax.set_xlim([-100,-70]) ax.set_ylim([35,65]) lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) p = ax.pcolormesh(X, Y, data3, vmin=-100000, #! important vmax=100000, #! important transform=projection, cmap='RdBu') #! Plot the last submap ax=axgr[3] #!important #************************************************************* #add ocean, coastline,borders,lakes,rivers,provinc_bodr ax.add_feature(cfeature.OCEAN) ax.add_feature(cfeature.COASTLINE,linewidth=0.3) ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.5) ax.add_feature(cfeature.LAKES, alpha=0.3) ax.add_feature(cfeature.RIVERS) ax.add_feature(provinc_bodr, linestyle='-', linewidth=1, edgecolor="k", zorder=10, alpha=0.5) ax.set_title('(d) Risk:RCP6.0,2080s',fontsize=18) ax.set_xticks(np.linspace(-100, -70, 5), crs=projection) ax.set_yticks(np.linspace(35, 65, 5), crs=projection) ax.set_xlim([-100,-70]) ax.set_ylim([35,65]) lon_formatter = LongitudeFormatter(zero_direction_label=True) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) p = ax.pcolormesh(X, Y, data4, vmin=-100000, #!important vmax=100000, #!important transform=projection, cmap='RdBu') #!Plot the shared colorbar axgr.cbar_axes[0].colorbar(p) plt.tight_layout() plt.show() fig.savefig('CombinedMapWithSameColorbar.png',dpi=150)