在气象与气候研究中,Weather Research and Forecasting (WRF) 模型是一个广泛使用的大气数值模拟工具。然而,WRF 输出的数据通常以 NetCDF 格式存储,并带有复杂的多维坐标和物理变量,这给数据处理和可视化带来了挑战。WRF-Python 作为一款专门用于解析和可视化 WRF 模型输出的 Python 库,极大地简化了这一过程。本文将详细介绍 WRF-Python 的功能、安装方法、基本使用,以及如何进行数据处理和可视化。


1. WRF-Python 简介

WRF-Python 是由 NCAR(美国国家大气研究中心)开发的一个 Python 库,基于 NCL (NCAR Command Language),提供了从 WRF 输出文件提取和处理气象变量的功能。它允许用户:

  • 读取 WRF 输出(NetCDF 格式)
  • 计算诊断变量(如温度、风速、相对湿度等)
  • 进行数据插值(水平插值、垂直插值)
  • 生成可视化图表
  • 处理大尺度气象数据并用于后续分析

  • 2. WRF-Python 的安装

    要使用 WRF-Python,建议在 Anaconda 或者虚拟环境中进行安装,以避免依赖冲突。

    2.1 安装 WRF-Python

    使用 conda 安装:

    conda install -c conda-forge wrf-python

    或者使用 pip

    pip install wrf-python

    安装后,可以通过以下命令验证:

    import wrf print(wrf.__version__)

    如果导入成功并输出版本号,说明安装完成。


    3. 读取 WRF 输出数据

    WRF 输出的数据通常以 NetCDF 格式存储,需要使用 netCDF4 库来读取。以下是一个简单的 WRF 文件读取示例:

    from netCDF4 import Dataset import wrf # 打开 WRF 输出文件 wrf_file = Dataset("wrfout_d01_2023-06-01_00:00:00") # 读取时间变量 times = wrf.getvar(wrf_file, "times", timeidx=0) print("模拟时间:", times)

    wrf.getvar 中:

  • wrf_file 是读取的 NetCDF 数据集
  • "times" 是要提取的变量
  • timeidx=0 表示读取第一个时间步的数据

  • 4. 提取基本气象变量

    WRF-Python 提供了许多便捷的函数来提取气象变量,例如:

    4.1 读取气象变量

    # 读取温度(单位:开尔文) temperature = wrf.getvar(wrf_file, "temp", timeidx=0) # 读取风速 u10 = wrf.getvar(wrf_file, "U10", timeidx=0) # 10m高度的U分量风速 v10 = wrf.getvar(wrf_file, "V10", timeidx=0) # 10m高度的V分量风速 # 读取相对湿度 rh = wrf.getvar(wrf_file, "rh", timeidx=0) print(temperature.shape, u10.shape, v10.shape, rh.shape)

    这些变量已经转换为 NumPy 数组,方便后续处理和可视化。

    4.2 计算海平面气压

    slp = wrf.getvar(wrf_file, "slp", timeidx=0)

    4.3 计算等值线图所需变量

    z = wrf.getvar(wrf_file, "z", timeidx=0) # 地形高度 ter = wrf.getvar(wrf_file, "ter", timeidx=0) # 地形


    5. 坐标转换

    WRF-Python 允许将 WRF 的网格坐标转换为 经纬度坐标,这在绘图时非常重要。

    lat, lon = wrf.latlon_coords(temperature) print(lat.shape, lon.shape)


    6. 可视化 WRF 数据

    WRF-Python 结合 matplotlib 进行数据可视化非常方便。下面是一些常见的绘图方法。

    6.1 绘制温度分布

    import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) plt.contourf(lon, lat, temperature, cmap="coolwarm") plt.colorbar(label="Temperature (K)") plt.xlabel("Longitude") plt.ylabel("Latitude") plt.title("Temperature Distribution") plt.show()

    6.2 绘制风场

    plt.figure(figsize=(10, 6)) plt.quiver(lon, lat, u10, v10, scale=400) plt.xlabel("Longitude") plt.ylabel("Latitude") plt.title("Wind Vector at 10m") plt.show()

    6.3 绘制海平面气压等值线

    import numpy as np plt.figure(figsize=(10, 6)) contours = plt.contour(lon, lat, slp, levels=np.arange(950, 1050, 2), colors="black") plt.clabel(contours, inline=True, fontsize=8) plt.xlabel("Longitude") plt.ylabel("Latitude") plt.title("Sea Level Pressure Contour") plt.show()


    7. 数据插值

    WRF 使用 sigma 垂直坐标,通常需要插值到等压面上进行分析。WRF-Python 提供了 interplevel 函数进行垂直插值。

    7.1 插值到 850 hPa

    from wrf import interplevel pressure = wrf.getvar(wrf_file, "pressure", timeidx=0) temp_850 = interplevel(temperature, pressure, 850)

    7.2 绘制 850 hPa 温度

    plt.figure(figsize=(10, 6)) plt.contourf(lon, lat, temp_850, cmap="coolwarm") plt.colorbar(label="Temperature (K)") plt.xlabel("Longitude") plt.ylabel("Latitude") plt.title("850 hPa Temperature") plt.show()


    8. 高级功能

    WRF-Python 还提供:

  • 垂直剖面图 (vertcross)
  • 水平插值 (xy_to_ll)
  • 风场诊断(如涡度计算)
  • NetCDF 数据的修改与存储
  • 作者:Hardess-god

    物联沃分享整理
    物联沃-IOTWORD物联网 » WRF-Python全面解析

    发表回复