1.前言
天气研究与预报 (WRF) 模型是一种功能强大的数值天气预报系统,用于模拟各种尺度的大气现象。WRF 生成大量输出数据,可为气象和气候研究、天气预报和环境管理提供宝贵信息。
WRF 输出数据通常存储在 netCDF 文件中,其中包含具有不同单位和维度的多个变量。但是,WRF 生成的 netCDF 文件并不总是遵循气候和预报 (CF) 元数据约定,这可能会使数据难以解释。
CF 元数据约定提供了一种标准化的方式来描述 netCDF 文件中变量的元数据和单位。遵守此约定可以更轻松地解释数据并将其与其他数据集进行比较。但是,WRF 输出文件通常不完全符合 CF 标准。
将 WRF 模型的输出可视化可以帮助研究人员和从业人员深入了解各种气象和气候现象,包括温度、风、降水、云量和大气压力。可视化是理解数据和提取有意义见解的重要步骤。可视化可以帮助识别数据中的模式、趋势和异常,而这些模式、趋势和异常可能从原始数值输出中无法看出。
- 时间序列图是可视化温度、降水量和风速等变量随时间变化的常用方法。这些图可以揭示数据中的模式和趋势,并有助于识别异常或离群值。
- 等值线图可用于直观显示温度、压力和降水等变量的空间分布。这些图可以显示变量的大小和方向,并有助于识别锋面、山脊和谷底等模式和特征。
- 地图是可视化感兴趣区域内变量空间分布的常用方法。地图可用于显示温度、降水量、风速和云量等变量,并有助于识别山脉、海岸线和河流等模式和特征。
- 可以根据 WRF 输出数据创建动画,以直观显示特定时期内变量的时间和空间演变。动画可用于识别数据中的趋势、模式和异常,并将结果传达给更广泛的受众。
- 3D 可视化可用于表示云和锋面等大气现象的三维结构。这些可视化可以更详细、更逼真地呈现数据,并有助于识别上升气流、下降气流和涡旋等特征。
2.相关可视化工具
有多种工具可用于可视化 WRF 输出,从简单的绘图库到更高级的图形用户界面。
(1)用于可视化 WRF 输出的最流行的工具之一是 NCAR 命令语言 (NCL)。NCL 是一种专为科学数据分析和可视化而设计的编程语言。NCL 提供了一套强大的工具来处理 NetCDF 文件,包括子集化和操作数据、生成等高线图和地图以及创建动画的功能。
(2)Python 是一种用于数据处理、分析和可视化的流行编程语言。Matplotlib、Cartopy 和 Basemap 等 Python 库可用于根据 WRF 输出数据创建各种可视化效果。
(3)Xarray 是另一个流行的 Python 库,可用于处理和可视化多维数据集。Xarray 提供了一组强大的数据操作、分析和可视化函数,可用于创建各种图表和地图。
(4)R 是一种统计编程语言,也可用于数据处理、分析和可视化。R 提供了各种用于创建静态和交互式可视化的软件包,包括 ggplot2、lattice 和 Shiny。
(5)可以使用 ArcGIS 等商业软件包和 QGIS 等开源地理信息系统 (GIS) 软件在地图上可视化 WRF 输出数据并执行空间分析。QGIS 提供了一个用户友好的界面,用于创建地图、可视化数据和进行地理空间分析。
3.风的可视化
有了 3 天的每小时信息,有几种方法可以可视化风速和风向,以最好地说明信息。
开始使用 Python 编写代码。
import xarray as xr
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.lines import Line2D
import numpy as np
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import pandas as pd
from windrose import WindroseAxes
# Load the WRF output file
ds = xr.open_dataset('wrfpost.nc')
# Extract the wind speed and direction variables
u_wind = ds.u_10m_gr.values
v_wind = ds.v_10m_gr.values
# Calculate the wind speed and direction
wind_speed = (u_wind ** 2 + v_wind ** 2) ** 0.5
wind_direction = 180 + (180 / np.pi) * np.arctan2(v_wind, u_wind)
# Get the first and last date in the dataset
start_date = pd.to_datetime(ds.time.values[0]).strftime('%Y-%m-%d %H:%M:%S')
end_date = pd.to_datetime(ds.time.values[-1]).strftime('%Y-%m-%d %H:%M:%S')
# Create a map projection
proj = ccrs.PlateCarree()
导入库并定义数据后,我们就可以开始可视化风数据了。
以下是一些选项:
3.1 时间序列图
我们可以创建一个时间序列图,显示三天内风速和风向的变化。这种类型的图对于识别数据随时间变化的模式或趋势很有用。我们可以使用 Matplotlib 或 Seaborn 等 Python 库来创建时间序列图。
# Create a figure and axis object
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection=proj))
# Set the plot extent
ax.set_extent([ds.lon.min(), ds.lon.max(), ds.lat.min(), ds.lat.max()])
# Add map features
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
ax.add_feature(cfeature.BORDERS, linewidth=0.5)
# Add the latitude and longitude grid
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=1, color='gray', alpha=0.5, linestyle='--')
gl.top_labels = False
gl.right_labels = False
gl.xlabel_style = {'size': 12, 'color': 'gray'}
gl.ylabel_style = {'size': 12, 'color': 'gray'}
# Add the wind vectors
q = ax.quiver(ds.lon.values, ds.lat.values, u_wind.mean(axis=0), v_wind.mean(axis=0), wind_speed.mean(axis=0),
transform=ccrs.PlateCarree(), cmap='plasma', pivot='middle', width=0.002, scale=80)
# Add a colorbar
cbar = fig.colorbar(q, orientation='horizontal', fraction=0.05, pad=0.1)
cbar.ax.set_xlabel('Wind Speed (m/s)')
# Create a string with the title and date information
title_str = f'Mean of Wind Speed and Direction\n{start_date} - {end_date}'
# Add a title
plt.title(title_str)
# Show the plot
plt.show()
上面的代码将产生下面的地图。
另外,我们可以将每个网格以随时间变化的线的形式进行可视化。
# Create a figure and axis object for time series plot
fig2, ax2 = plt.subplots(figsize=(10, 5))
# Plot wind speed for each grid point as a line
for i in range(wind_speed.shape[1]):
for j in range(wind_speed.shape[2]):
ax2.plot(ds.time.values, wind_speed[:, i, j], color='Grey', linewidth=0.1)
# Calculate and plot the mean wind speed across all grid points for each time step
wind_speed_mean = wind_speed.mean(axis=(1, 2))
lines2 = ax2.plot(ds.time.values, wind_speed_mean, linestyle='--', color='blue', linewidth=2)
# Set x-axis label
ax2.set_xlabel('Time')
# Set y-axis label
ax2.set_ylabel('Wind Speed (m/s)')
# Create a string with the title and date information
title_str = f'Wind Speed Time Series\n{start_date} - {end_date}'
# Add a title
plt.title(title_str)
# Add legend
legend_elements = [Line2D([0], [0], color='gray', lw=0.5, label='Wind speed for each grid point'),
Line2D([0], [0], linestyle='--', color='blue', lw=2, label='Mean wind speed across all grid points')]
ax2.legend(handles=legend_elements, loc='upper left')
# Show the plot
plt.show()
上面的代码将生成下面的图表。
3.2 风玫瑰图
风玫瑰图可用于显示三天内风向和风速的分布。这种类型的图可用于识别盛行风向和风速。可以使用 Windrose 或 Matplotlib 等 Python 库来创建风玫瑰图。
# Create a WindroseAxes object
ax = WindroseAxes.from_ax()
# Plot the wind rose
ax.bar(wind_direction.flatten(), wind_speed.flatten(), normed=True, opening=0.8, edgecolor='white', cmap=cm.plasma)
# Set the title and legend
ax.set_title('Wind Speed and Direction')
ax.legend(title='Wind Speed (m/s)', loc='center left', bbox_to_anchor=(1, 0.5))
# Show the plot
plt.show()
上面的代码将生成下面的图表。
3.3 等高线图
等值线图可用于显示三天内特定时间的风速和风向的空间分布。这种类型的图可用于识别风速和风向高或低的区域。您可以使用 Python 库(例如 Matplotlib、Cartopy 或 Basemap)来创建等值线图。
# Create a figure and axis object
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection=proj))
# Set the plot extent
ax.set_extent([ds.lon.min(), ds.lon.max(), ds.lat.min(), ds.lat.max()])
# Add map features
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
ax.add_feature(cfeature.BORDERS, linewidth=0.5)
# Add the latitude and longitude grid
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=1, color='gray', alpha=0.5, linestyle='--')
gl.top_labels = False
gl.right_labels = False
gl.xlabel_style = {'size': 12, 'color': 'gray'}
gl.ylabel_style = {'size': 12, 'color': 'gray'}
# Create a contour plot of wind speed
cf = ax.contourf(ds.lon, ds.lat, wind_speed.mean(axis=0),
transform=ccrs.PlateCarree(), cmap='plasma')
# Add a colorbar
cbar = fig.colorbar(cf, orientation='horizontal', fraction=0.05, pad=0.1)
cbar.ax.set_xlabel('Wind Speed (m/s)')
# Create a string with the title and date information
title_str = f'Mean of Wind Speed\n{start_date} - {end_date}'
# Add a title
plt.title(title_str)
# Show the plot
plt.show()
上面的代码将产生下面的地图。
3.4 风向箭头图
流线图可用于显示三天内特定时间的风向和风速流动情况。这种类型的图可用于识别某个地理区域的风向。您可以使用 Python 库(例如 Matplotlib、Cartopy 或 Basemap)来创建流线图。
# Define the maximum and minimum line width
max_width = 5.0
min_width = 1.0
# Normalize the streamline speed to the range [0, 1]
speed_norm = (wind_speed.mean(axis=0) - wind_speed.mean(axis=0).min()) / (wind_speed.mean(axis=0).max() - wind_speed.mean(axis=0).min())
# Calculate the linewidths based on the normalized speed
linewidths = min_width + (max_width - min_width) * speed_norm
# Create a figure and axis object
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection=proj))
# Set the plot extent
ax.set_extent([ds.lon.min(), ds.lon.max(), ds.lat.min(), ds.lat.max()])
# Add map features
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
ax.add_feature(cfeature.BORDERS, linewidth=0.5)
# Add the latitude and longitude grid
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=1, color='gray', alpha=0.5, linestyle='--')
gl.top_labels = False
gl.right_labels = False
gl.xlabel_style = {'size': 12, 'color': 'gray'}
gl.ylabel_style = {'size': 12, 'color': 'gray'}
# Add the wind streamlines
strm = ax.streamplot(ds.lon.values, ds.lat.values, u_wind.mean(axis=0), v_wind.mean(axis=0),
transform=ccrs.PlateCarree(), cmap='plasma', density=1, color=wind_speed.mean(axis=0),
linewidth=linewidths, arrowstyle='->', arrowsize=1.5, minlength=0.1)
# Create a custom legend
legend_elements = [
Line2D([0], [0], color='blue', linewidth=0.5, linestyle='-', alpha=0.7,
label='Low Wind Speed'),
Line2D([0], [0], color='blue', linewidth=1.5, linestyle='-', alpha=0.7,
label='Medium Wind Speed'),
Line2D([0], [0], color='blue', linewidth=3, linestyle='-', alpha=0.7,
label='High Wind Speed')
]
# Create a colorbar
cbar = plt.colorbar(strm.lines, orientation='horizontal', fraction=0.05, pad=0.1)
cbar.set_label('Wind Speed (m/s)')
# Add the legend to the plot
ax.legend(handles=legend_elements, loc='upper center', bbox_to_anchor=(0.5, -0.05), ncol=3)
# Create a string with the title and date information
title_str = f'Wind Streamlines\n{start_date} - {end_date}'
# Add a title
plt.title(title_str)
# Show the plot
plt.show()
上面的代码将产生下面的地图。
4. 小结
总体而言,可视化方法的选择将取决于具体的研究问题或应用,以及预期的受众。尝试不同的可视化方法并比较结果以确定哪种方法对手头的任务最有效可能是有用的。