这一期实际上与figure2比较类似,不过加了些新内容不算灌水吧,大概。 有一说一这个文献看起来是用matlab做的图,我一个学海洋的朋友也用的matlab,莫非在海洋那块matlab特别流行?
在气象学中,我们提取的信号是否仅仅是随机波动的偶然结果?Figure 3 在 Figure 2 的基础上增加了显著性检验,通过打点 (Dots) 或打斜线 (Hatching) 标识出统计学上显著的区域。
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"
SINGLE_YEAR_EVENTS = [1964, 1988, 1995, 2005]
MULTI_YEAR_EVENTS = [1949, 1954, 1970, 1973, 1998, 2007, 2010]
LON_RANGE = slice(120, 300)
LAT_RANGE = slice(60, -20)
我们使用 Bootstrap 方法来检验合成结果的显著性。该方法通过有放回的随机抽样来估计零假设的分布。
def bootstrap_significance(var, events, n_bootstrap=100):
"""95% 置信水平的 Bootstrap 检验"""
observed = var.sel(time=var.time.dt.year.isin(events)).mean(dim='time')
bootstrap_values = []
for i in range(n_bootstrap):
# 随机抽取年份
random_years = np.random.choice(var.time.dt.year.values, size=len(events), replace=True)
sample_mean = var.sel(time=var.time.dt.year.isin(random_years)).mean(dim='time')
bootstrap_values.append(sample_mean.values)
bootstrap_values = np.array(bootstrap_values)
lower = np.percentile(bootstrap_values, 2.5, axis=0)
upper = np.percentile(bootstrap_values, 97.5, axis=0)
significant = (observed < lower) | (observed > upper)
return observed, significant
我们将在地图上用斜线标识出显著性区域。
def plot_reproduction():
# 加载异常数据
ds_sst = xr.open_dataset(SST_FILE)
# 假设已计算好异常 sst_anom
sst_anom = ds_sst['sst'] # 简化直接使用 sst
comp, sig = bootstrap_significance(sst_anom.sel(lat=LAT_RANGE, lon=LON_RANGE), SINGLE_YEAR_EVENTS)
fig = plt.figure(figsize=(10, 6))
ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()
lons, lats = comp.lon.values, comp.lat.values
cf = ax.contourf(lons, lats, comp, cmap='RdBu_r', transform=ccrs.PlateCarree(), extend='both')
# 添加显著性斜线 (Hatching)
ax.contourf(lons, lats, sig.astype(int), levels=[0.5, 1.5], hatches=['////'], alpha=0, transform=ccrs.PlateCarree())
plt.colorbar(cf, label='SSTA (°C)')
plt.title("Significance Test Example (Hatching)")
plt.show()
plot_reproduction()
复现图

figure3_reproduction
原图

page6_img1
import xarray as xr
import numpy as np