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

EOF绘图累积功能实现求助:如何生成前N个EOF模态的累积和图

解决EOF累积求和循环绘图问题

原代码核心问题

  • 子图布局参数顺序错误:plt.subplot(ncols,nrows,i+1) 应为 plt.subplot(nrows,ncols,index),导致子图排列混乱
  • 累积和判断逻辑失效:用if ncols ==3判断毫无意义,未对应每行末尾的子图位置
  • 求和方式错误:sum(i) 是对循环变量整数求和,而非对EOF模态数据求和
  • 未预留累积和子图位置:原循环仅处理12个模态,未包含4个累积和的绘图逻辑

修正后的代码

def GPH_EOFs_plot(eof12):
    fig = plt.figure(figsize=(16, 12))  # 适配4行4列布局,放大画布保证清晰度
    clevs = np.linspace(-75, 75, 11)
    proj = ccrs.Orthographic(central_longitude=-90, central_latitude=90)
    ncols = 4
    nrows = 4

    # 绘制单个EOF模态(前12个,每行3个)
    for i in range(12):
        row = i // 3 + 1
        col = i % 3 + 1
        ax_idx = (row - 1)*ncols + col
        ax = plt.subplot(nrows, ncols, ax_idx, projection=proj)
        ax.coastlines(color='grey', linewidth=1.0)
        ax.set_global()
        
        eofs = eof12.sel(mode=i)
        eofs_2d = eofs.squeeze()
        eofs_2d.plot.contourf(
            ax=ax, levels=clevs, cmap=plt.cm.RdBu_r,
            transform=ccrs.PlateCarree(), add_colorbar=False
        )
        ax.set_title(f'EOF Mode {i+1}')

    # 绘制累积和图(每行第4列)
    sum_modes = [3,6,9,12]  # 对应前3、6、9、12个模态的累积和
    for idx, mode_count in enumerate(sum_modes):
        row = idx + 1
        ax_idx = row * ncols  # 每行最后一个子图的索引
        ax = plt.subplot(nrows, ncols, ax_idx, projection=proj)
        ax.coastlines(color='grey', linewidth=1.0)
        ax.set_global()
        
        # 计算前N个模态的累积和
        eof_sum = eof12.sel(mode=slice(0, mode_count)).sum(dim='mode')
        eof_sum_2d = eof_sum.squeeze()
        cf = eof_sum_2d.plot.contourf(
            ax=ax, levels=clevs, cmap=plt.cm.RdBu_r,
            transform=ccrs.PlateCarree(), add_colorbar=True,
            cbar_kwargs={'orientation': 'horizontal', 'pad': 0.05}
        )
        ax.set_title(f'Cumulative Sum (Top {mode_count})')

    plt.tight_layout()
    plt.savefig("EOFs_with_cumulative.png", format='png', dpi=150)

关键修改说明

  • 布局适配:改为4行4列结构,预留每行第4列用于累积和绘图,同时放大画布避免图面拥挤
  • 子图索引计算:通过i//3和i%3定位单个模态的行/列,累积和直接对应每行最后一个索引
  • 正确求和逻辑:用slice(0, mode_count)选取前N个模态,通过sum(dim='mode')完成维度上的累积求和
  • 统一配置:将重复的绘图参数(如clevs、proj)提取到循环外,减少冗余代码
  • 可视化优化:给每个子图添加明确标题,累积和图配置水平颜色条并调整间距,提升可读性

内容的提问来源于stack exchange,提问作者humanoid_physics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:24:51