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
相关产品推荐
相关产品推荐

