如何让Matplotlib子图共享单个色条?ERA5数据绘图求助
Matplotlib子图共享单个色条实现方案
问题背景
基于ERA5逐小时数据集,绘制9月至次年4月的850hPa比湿月平均图,采用3×3子图布局,需让所有子图共享一个色条,替代原代码中每个子图单独添加色条的方式。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cf # 假设lons, lats, shum_month已提前加载处理完成 ib = 3 jb = 3 fig = plt.figure(figsize=(20,15)) # 统一设置色阶,确保所有子图颜色映射范围一致 levels = np.arange(0, 100) cmap = 'magma_r' # 定义要绘制的月份及对应标题 months = [9,10,11,12,1,2,3,4] titles = ['(a) Sep', '(b) Oct', '(c) Nov', '(d) Dec', '(e) Jan', '(f) Feb', '(g) Mar', '(h) Apr'] # 循环绘制子图 for i in range(len(months)): ax = plt.subplot(3,3,i+1, projection=ccrs.PlateCarree()) # 加载对应月份的数据,修正原代码中的索引错误 data = np.squeeze(shum_month[shum_month.month == months[i]]) # 仅记录第一个子图的contourf对象,用于后续创建共享色条 if i == 0: chandles = ax.contourf(lons, lats, data, levels=levels, cmap=cmap) else: ax.contourf(lons, lats, data, levels=levels, cmap=cmap) # 添加地图边界特征 ax.add_feature(cf.COASTLINE, alpha=0.5) ax.add_feature(cf.BORDERS, alpha=0.5, linestyle='--') # 设置坐标轴刻度与范围 xticks = np.arange(8,56,8) ax.set_xticks(xticks) ax.set_xlim([8,50]) yticks = np.arange(-50,0,10) ax.set_yticks(yticks) ax.set_ylim([-50,-10]) # 设置子图标题 ax.set_title(titles[i]) # 添加全局共享色条,适配子图布局调整长度 fig.colorbar(chandles, ax=fig.get_axes(), orientation='vertical', label=r'850-hPa Specific Humidity $(g {kg}^{-1})$', shrink=0.8) fig.savefig('shum_850hPa.jpg', dpi=1000) plt.close()
关键优化说明
- 统一色阶基准:所有子图使用相同的
levels参数,保证不同月份的数据颜色映射标准一致,这是共享色条的核心前提。 - 循环简化冗余代码:用循环替代重复的子图绘制逻辑,减少代码量,同时方便后续扩展月份数量。
- 共享色条实现:使用
fig.colorbar()替代plt.colorbar(),通过ax=fig.get_axes()将色条关联所有子图,shrink参数调整色条长度以适配整体布局。 - 修复原代码错误:修正了原代码中数据集索引的笔误(如
shum_month[cape_month.month==10]改为shum_month[shum_month.month==10])。
内容的提问来源于stack exchange,提问作者Samkelo Magwala
相关产品推荐
相关产品推荐

