从WRF输出到精美图表:手把手教你用NCL绘制气温、降水和风场空间分布图
2026/6/7 11:39:22 网站建设 项目流程

WRF数据可视化实战:用NCL打造科研级气象图表

气象模拟数据的可视化是科研成果展示的关键环节。当WRF模式运行结束后,面对海量的wrfout文件,如何将原始数据转化为直观、专业的图表,成为许多研究者面临的挑战。本文将聚焦地表温度、2米气温、累计降水和10米风场等核心变量,通过NCL脚本实现从数据提取到出版级图表的全流程操作。

1. 环境准备与数据预处理

在开始绘图前,需要确保NCL环境配置正确。推荐使用conda安装最新版NCL:

conda create -n ncl_env -c conda-forge ncl conda activate ncl_env

WRF输出数据通常采用NetCDF格式存储,首先需要检查数据完整性。使用ncl_filedump命令快速查看文件结构:

ncl_filedump wrfout_d01_2020-01-01_00:00:00 | less

典型WRF输出包含三维变量(如温度场)和二维变量(如地表温度)。以2米温度(T2)为例,其维度为(Time, south_north, west_east),单位是开尔文(K)。在绘图前常需要进行单位转换:

t2_c = t2_k - 273.15 ; 转换为摄氏度

对于区域选择,可使用wrf_user_getvar函数提取子区域:

lat = wrf_user_getvar(a, "XLAT", 0) lon = wrf_user_getvar(a, "XLONG", 0)

2. 温度场可视化技巧

温度场是气象分析的基础要素。WRF提供了多层次的温度数据,包括地表温度(TSK)和2米温度(T2)。绘制温度分布图时,色标选择直接影响图表效果。

推荐配色方案:

  • 温差分析:使用BlueRedViBlGrWhYeOrRe渐变色
  • 绝对温度:rainbowMPL_viridis
res = True res@cnFillOn = True res@cnFillPalette = "ViBlGrWhYeOrRe" res@cnLevelSelectionMode = "ManualLevels" res@cnMinLevelValF = -10 res@cnMaxLevelValF = 40 res@cnLevelSpacingF = 2

处理地形影响时,可叠加等高线增强表现力:

ter = wrf_user_getvar(a, "HGT", 0) res_ter = True res_ter@cnFillOn = False res_ter@cnLinesOn = True plot = gsn_csm_contour_map(wks, t2_c, res) plot_ter = gsn_csm_contour(wks, ter, res_ter) overlay(plot, plot_ter)

3. 降水数据可视化方法

WRF提供多种降水变量,最常用的是累积格点降水(RAINNC)。处理降水数据时需注意:

  1. 时间积分:瞬时降水需转换为累积量
  2. 单位统一:确保使用mm或inch等标准单位
  3. 零值处理:设置合适的显示阈值
rain = wrf_user_getvar(a, "RAINNC", -1) ; 获取所有时次 rain_total = dim_sum_n_Wrap(rain, 0) ; 时间维度求和 res_rain = True res_rain@cnFillPalette = "WhiteBlueGreenYellowRed" res_rain@lbTitleString = "Accumulated Precipitation (mm)"

对于强降水过程,可采用对数间隔色标:

res_rain@cnLevelSelectionMode = "ExplicitLevels" res_rain@cnLevels = (/0.1,1,5,10,20,50,100/) res_rain@cnFillColors = (/0,10,20,30,40,50,60,70/)

4. 风场与复合图表绘制

10米风场(U10/V10)可视化需要处理矢量箭头密度和大小。关键参数包括:

参数说明推荐值
vcMinDistanceF箭头最小间距0.015
vcRefLengthF参考箭头长度0.02
vcRefMagnitudeF参考风速大小10 m/s
wind_res = True wind_res@vcMinDistanceF = 0.015 wind_res@vcRefLengthF = 0.02 wind_res@vcRefMagnitudeF = 10.0 wind_res@vcGlyphStyle = "CurlyVector"

创建复合图表时,使用gsn_panel合并多个子图:

plots = new(2, graphic) plots(0) = gsn_csm_contour_map(wks, t2_c, res) plots(1) = gsn_csm_vector_scalar_map(wks, u10, v10, rain_total, wind_res) pnl_res = True pnl_res@txString = "Surface Analysis" gsn_panel(wks, plots, (/2,1/), pnl_res)

5. 高级定制与输出优化

出版级图表需要精细调整各类元素:

地图底图控制:

mp_res = True mp_res@mpDataBaseVersion = "HighRes" mp_res@mpOutlineBoundarySets = "AllBoundaries" mp_res@mpGeophysicalLineColor = "black"

色标与图例优化:

res@lbOrientation = "Vertical" res@lbTitlePosition = "Right" res@lbTitleFontHeightF = 0.015 res@pmLabelBarHeightF = 0.6

输出格式选择:

  • PNG:适合快速查看和网页展示
  • PDF/PS:适合印刷出版
  • X11:交互式预览
wks_type = "png" wks_type@wkWidth = 1600 wks_type@wkHeight = 1200 wks = gsn_open_wks(wks_type, "wrf_plot")

实际项目中,我经常遇到色标与数据范围不匹配的问题。通过添加自动缩放功能可以显著提高效率:

function auto_levels(data, nlev) local minv, maxv, range begin minv = min(data) maxv = max(data) range = maxv - minv return fspan(minv, maxv, nlev) end

处理WRF-Chem等特殊输出时,需要注意额外变量的单位转换和特殊配色方案。例如PM2.5浓度可视化:

res_pm25 = True res_pm25@cnFillPalette = "WhiteYellowOrangeRed" res_pm25@lbTitleString = "PM~B~2.5~N~ (~F33~m~F~g/m~S~3~N~)"

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询