首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >论文复现 | 第 01 章:Hovmöller 图——揭示气候变率的时间演变

论文复现 | 第 01 章:Hovmöller 图——揭示气候变率的时间演变

作者头像
用户11172986
发布2026-04-24 19:32:44
发布2026-04-24 19:32:44
870
举报
文章被收录于专栏:气python风雨气python风雨

论文复现 | 第 01 章:Hovmöller 图——揭示气候变率的时间演变

前言

近来小编花销见涨,但收益不见涨,遂将积压的老代码做一下付费。这个主题针对一个2020年的enso文献《Mid-latitude leading double-dip La Niña》做一下复现,大概出个六七期。如有疏漏还望指出。如需数据可以通过公众号后台联系。

1. 科学背景

Hovmöller 图(时间-经度/纬度图)是气象和海洋学中分析波动传播(如 Kelvin 波、Rossby 波)和气候事件(如 ENSO)演化的核心工具。

在 《Mid-latitude leading double-dip La Niña》 的 Figure 1 中,作者通过 Hovmöller 图对比了单年型 (Single-year)多年型 (Multi-year) La Niña 事件在赤道太平洋海温 (SSTA) 和风应力异常上的演变特征。

代码语言:javascript
复制
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import os

# --- 配置 ---
DATA_DIR = r"./data"
SST_FILE = f"{DATA_DIR}/sst.mnmean.nc"
TAUX_FILE = f"{DATA_DIR}/uflx.mon.mean.nc"
TAUY_FILE = f"{DATA_DIR}/vflx.mon.mean.nc"

# 论文 Table 1 中的事件年份
SINGLE_YEAR_EVENTS = [1964, 1988, 1995, 2005]
MULTI_YEAR_EVENTS = [1949, 1954, 1970, 1973, 1998, 2007, 2010]

# 气候态周期
CLIM_START = '1981-01-01'
CLIM_END = '2010-12-31'

# 分析范围
LON_RANGE = slice(120, 280) # 120E to 80W
LAT_EQ_RANGE = slice(-5, 5) # 赤道平均范围 (5S-5N)
LAT_OFF_EQ_RANGE = slice(0, 15) # 副热带范围 (0-15N)

2. 核心绘图逻辑

Hovmöller 图的 Y 轴是时间,X 轴是经度。我们将在此叠加海温 (Shade)、风应力旋度 (Contour) 和纬向风应力 (Vector)。

代码语言:javascript
复制
def plot_reproduction():
    # 加载 SST 并计算异常
    ds_sst = xr.open_dataset(SST_FILE).sortby('lat')
    sst_anom = calculate_anomaly(ds_sst, 'sst')
    sst_hov_raw = sst_anom.sel(lat=LAT_EQ_RANGE, lon=LON_RANGE).mean(dim='lat')
    
    # 合成数据
    comp_sst_single = get_composite(sst_hov_raw, SINGLE_YEAR_EVENTS)
    comp_sst_multi = get_composite(sst_hov_raw, MULTI_YEAR_EVENTS)
    
    lons = sst_hov_raw.lon.values
    months = np.arange(36)
    
    fig, axes = plt.subplots(1, 2, figsize=(12, 8), sharey=True)
    
    levels = np.arange(-2.0, 2.1, 0.2)
    
    for i, (data, title) in enumerate(zip([comp_sst_single, comp_sst_multi], 
                                          ["(a) Single-year La Niña", "(b) Multi-year La Niña"])):
        ax = axes[i]
        cf = ax.contourf(lons, months, data, levels=levels, cmap='RdBu_r', extend='both')
        ax.set_title(title, fontsize=14)
        ax.set_ylim(35, 0) # 时间由上往下
        ax.set_xticks(np.arange(120, 281, 40))
        ax.set_xticklabels(["120E", "160E", "160W", "120W", "80W"])
        ax.set_yticks([0, 12, 24, 35])
        ax.set_yticklabels(["Jan(-1)", "Jan(0)", "Jan(+1)", "Dec(+1)"])
    
    fig.colorbar(cf, ax=axes, orientation='horizontal', label='SSTA (°C)', pad=0.1)
    plt.show()

plot_reproduction()

4. 复现图与原图对比

复现图

figure1_reproduction
figure1_reproduction

figure1_reproduction

原图

page4_img1
page4_img1

5.完整代码

代码语言:javascript
复制
import xarray as xr
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 论文复现 | 第 01 章:Hovmöller 图——揭示气候变率的时间演变
    • 前言
    • 1. 科学背景
    • 2. 核心绘图逻辑
    • 4. 复现图与原图对比
    • 5.完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档