python 画2023-24 年厄尔尼诺的海温与海表高度异常分布图
python 画2023-2024厄尔尼诺期间的海表面温度异常和海表面高度异常分布图
2023-24 年厄尔尼诺的海温与海表高度异常
在研究气候异常事件如厄尔尼诺(El Niño)时,**海表温度异常(SSTA)和海表高度异常(SLA)**是两个关键指标。今天我们来详细解析一幅图它呈现了 2023-24 年厄尔尼诺期间的 SSTA 与 SLA 空间分布。
图片
🔍 这幅图展示了什么?
我们绘制的是:
背景色彩填图(contourf):2023 年 6 月至 2024 年 1 月的SSTA(单位:°C)
白色等值线(contour):增强海温结构的等温线,很弱
黑色/灰色等高线:对应时段的 SLA 正/负异常(单位:米)
虚线赤道:地理标识
灰色轮廓线:陆地边界或研究区域边界
📍地图设置
proj = ccrs.PlateCarree(central_longitude=180)
fig = plt.figure(figsize=(12.5,12.5))
ax1=fig.add_subplot(421)
这里采用 PlateCarree(等距经纬)投影,中心经线设为 180°,更好地展示太平洋区域。
🌡️ 绘制海温异常 SSTA
ctrf = ax1.contourf(xx1,yy1,sstanom2023JuntoJan[:,:],levels=levels1,
extend=‘both’,norm=norm1,cmap=newcolor1)
sstanom2023JuntoJan 是从 .mat 文件读取的海温异常数据(单位 °C)
levels1 = np.arange(-2.0, 2.01, 0.2) 设定了颜色分级范围
使用自定义蓝红渐变色图(newcolor1)高亮冷暖异常区域
白色细线再叠加一层:
ax1.contour(xx1, yy1, sstanom2023JuntoJan, levels=np.arange(-6,6.01,0.6), colors=‘white’, linewidths=0.1)
🌊 添加海表高度异常 SLA 的等值线
ax1.contour(xx3,yy3,sla2023JuntoJan[:,:],levels=levels1a, colors=‘k’, linestyles=‘solid’, linewidths=1)
ax1.contour(xx3,yy3,sla2023JuntoJan[:,:],levels=levels1b, colors=‘grey’, linestyles=‘solid’, linewidths=1)
sla2023JuntoJan 为 SLA 数据
levels1a 是 SLA 的正异常(黑色线),levels1b 为负异常(灰色线)
通过海温与海表高度共同呈现,可揭示海洋热膨胀与风应力等动力学过程的耦合关系。
📐 坐标轴与美化
ax1.axhline(y=0, c=‘grey’, ls=‘–’, lw=1) 添加赤道线
ax1.set_title(‘a. SSTA & SLA (2023-24 El Niño)’, loc=‘left’, fontsize=16) 设置图标题
设置经纬度范围:
ax1.set(xlim=(130, 290), ylim=(-25, 25))
对应从西太平洋(130°E)到东太平洋(100°W),覆盖典型 ENSO 区域
自定义经纬度标签,如:
ax1.set_xticklabels([‘140 E’,‘180’,‘140 W’,‘100 W’],fontsize=16)
ax1.set_yticklabels([‘20 S’,‘10 S’,‘Eq’,‘10 N’,‘20 N’],fontsize=16)
色阶直观,负值为冷异常,正值为暖异常
SLA 轮廓线用于辅助判断热胀冷缩、风应力隆起/下陷效应
赤道线与陆地轮廓便于地理定位
一图洞察海洋变化
“图 ”整合了两个关键变量,有效展示了 2023-24 年厄尔尼诺期间热带太平洋的异常状态。此类图像是理解 ENSO 现象海气耦合机制的利器,
参考文献:
Tao Lian, Jie Wang, Dake Chen, Ting Liu, Dazhi Wang.
A Strong 2023/24 El Niño is Staged by Tropical Pacific Ocean Heat Content Buildup. Ocean-Land-Atmos Res. 2023;2:0011.DOI:10.34133/olar.0011
代码:
==start=
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib.colors import Normalize, ListedColormap
import scipy.io as scio
import cmaps
读取数据
mat_contents = scio.loadmat(r’Fig1.mat’)
for var_name, var_value in mat_contents.items():
exec(f’{var_name} = var_value’)
网格定义
xx1, yy1 = np.meshgrid(lon, lat)
xx3, yy3 = np.meshgrid(loninterp, latinterp)
colormap 和 levels 设置
cmapcolor = cmaps.GMT_polar
newcoloraa = cmapcolor(np.linspace(0, 1, 100))
new = np.vstack((newcoloraa[10:40, :], newcoloraa[60:90, :]))
newcolor1 = ListedColormap(new)
norm1 = Normalize(vmin=-2.0, vmax=2.0)
levels1 = np.arange(-2.0, 2.01, 0.2)
levels1a = np.arange(0.04, 0.241, 0.04)
levels1b = np.arange(-0.24, -0.039, 0.04)
画图
fig = plt.figure(figsize=(8, 4))
ax = fig.add_subplot(111)
填色图
ctrf = ax.contourf(xx1, yy1, sstanom2023JuntoJan, levels=levels1, extend=‘both’,
norm=norm1, cmap=newcolor1)
SSTA 白色等值线
ax.contour(xx1, yy1, sstanom2023JuntoJan, levels=np.arange(-6, 6.01, 0.6),
linestyles=‘solid’, colors=‘white’, linewidths=0.1)
赤道线
ax.axhline(y=0, c=‘grey’, ls=‘–’, lw=1)
SLA 黑/灰等值线
ax.contour(xx3, yy3, sla2023JuntoJan, levels=levels1a, colors=‘k’, linestyles=‘solid’, linewidths=1)
ax.contour(xx3, yy3, sla2023JuntoJan, levels=levels1b, colors=‘grey’, linestyles=‘solid’, linewidths=1)
海岸线
ax.plot(clx, cly, c=‘grey’, linewidth=1)
坐标设置
ax.set_xlim(130, 290)
ax.set_ylim(-25, 25)
ax.set_xticks(np.arange(140, 281, 40))
ax.set_xticklabels([‘140 E’, ‘180’, ‘140 W’, ‘100 W’], fontsize=14)
ax.set_yticks(np.arange(-20, 21, 10))
ax.set_yticklabels([‘20 S’, ‘10 S’, ‘Eq’, ‘10 N’, ‘20 N’], fontsize=14)
坐标轴刻度样式
ax.tick_params(length=5, width=2, labelsize=14)
ax.xaxis.set_major_locator(MultipleLocator(40))
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(5))
标题
ax.set_title(’ SSTA & SLA (2023-24 El Niño)', loc=‘left’, fontsize=16)
colorbar
cb = fig.colorbar(ctrf, ax=ax, orientation=‘vertical’, pad=0.02,
ticks=np.arange(-2, 2.01, 1), extend=‘both’)
cb.ax.tick_params(labelsize=14)
cb.set_label(‘SSTA (°C)’, fontsize=14)
plt.tight_layout()
fig.savefig(r’Fig1_gong.png’,dpi=500, bbox_inches = ‘tight’, pad_inches = 0.03)
plt.show()
719

被折叠的 条评论
为什么被折叠?



