首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >论文复现 | 第 02 章:序列空间合成图——拉尼娜的四季

论文复现 | 第 02 章:序列空间合成图——拉尼娜的四季

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

第 02 章:序列空间合成图——拉尼娜的四季

前言

这几天老广下了挺大雨,果不其然是一个飑线个例,跟师兄侃大山说快存数据做文章,师兄直言忙得跟陀螺一样哪有空。

言归正传,这次带来的是拉尼娜四季的平面分布图。

1. 科学背景

Figure 2 展示了 Single-year 和 Multi-year La Niña 从发展到消亡的 4 个关键季节的空间演变,涵盖了海温 (SSTA)、气压 (SLPA)、低层风 (Wind) 和降水 (Precipitation) 四个关键要素。

代码语言:javascript
复制
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

# --- 配置 ---
DATA_DIR = r"./data"
SST_FILE = f"{DATA_DIR}/sst.mnmean.nc"
SLP_FILE = f"{DATA_DIR}/slp.mon.mean.nc"
UWND_FILE = f"{DATA_DIR}/uwnd.mon.mean.nc"
VWND_FILE = f"{DATA_DIR}/vwnd.mon.mean.nc"
PRATE_FILE = f"{DATA_DIR}/prate.mon.mean.nc"

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, 300)
LAT_RANGE = slice(60, -20)

2. 核心函数

我们需要计算异常值并进行季节合成。此外,由于不同数据的网格不同,需要统一插值。

代码语言:javascript
复制
def calculate_anomaly(ds, var_name):
    clim = ds.sel(time=slice(CLIM_START, CLIM_END)).groupby("time.month").mean("time")
    anom = ds.groupby("time.month") - clim
    return anom[var_name]

def get_seasonal_composite(var, events, season_months):
    composites = []
    for year in events:
        start_date = f"{year}-01-01"
        end_date = f"{year}-12-31"
        try:
            chunk = var.sel(time=slice(start_date, end_date))
            seasonal = chunk.sel(time=chunk.time.dt.month.isin(season_months)).mean(dim='time')
            composites.append(seasonal.values)
        except:
            pass
    return np.nanmean(composites, axis=0)

3. 绘图实现

我们将展示如何在一个图表中排列 8 个面板(4 个季节 × 2 种类型)。

代码语言:javascript
复制
def plot_reproduction():
    # 加载数据(示例仅加载 SST)
    ds_sst = xr.open_dataset(SST_FILE)
    sst_anom = calculate_anomaly(ds_sst, 'sst').sel(lat=LAT_RANGE, lon=LON_RANGE)
    
    seasons = [(12, 1, 2, "D[-1]JF[0]"), (7, 8, 9, "JAS[0]")] # 简化展示 2 个季节
    
    fig = plt.figure(figsize=(12, 8))
    lons, lats = sst_anom.lon.values, sst_anom.lat.values
    
    for i, (m1, m2, m3, name) in enumerate(seasons):
        # Single-year
        ax1 = fig.add_subplot(2, 2, 2*i+1, projection=ccrs.PlateCarree(central_longitude=180))
        data1 = get_seasonal_composite(sst_anom, SINGLE_YEAR_EVENTS, [m1, m2, m3])
        ax1.contourf(lons, lats, data1, cmap='RdBu_r', transform=ccrs.PlateCarree(), extend='both')
        ax1.coastlines() # Add coastlines
        ax1.set_title(f"Single-year: {name}")
        
        # Multi-year
        ax2 = fig.add_subplot(2, 2, 2*i+2, projection=ccrs.PlateCarree(central_longitude=180))
        data2 = get_seasonal_composite(sst_anom, MULTI_YEAR_EVENTS, [m1, m2, m3])
        ax2.contourf(lons, lats, data2, cmap='RdBu_r', transform=ccrs.PlateCarree(), extend='both')
        ax2.coastlines() # Add coastlines
        ax2.set_title(f"Multi-year: {name}")
        
    plt.tight_layout()
    plt.show()

plot_reproduction()

4. 复现图与原图对比

复现图

figure2_reproduction
figure2_reproduction

原图

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第 02 章:序列空间合成图——拉尼娜的四季
    • 前言
    • 1. 科学背景
    • 2. 核心函数
    • 3. 绘图实现
    • 4. 复现图与原图对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档