You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:06:33