WRF输出结果的可视化展示与分析:以风速为例

news2024/11/16 9:33:22

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. 小结

        总体而言,可视化方法的选择将取决于具体的研究问题或应用,以及预期的受众。尝试不同的可视化方法并比较结果以确定哪种方法对手头的任务最有效可能是有用的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI生成PPT怎么用?5款AI PPT工具助你轻松制作演示文稿

当你站在山西应县木塔之下,仰望这座千年古塔的雄伟与震撼,心中不禁涌起一股对历史与建筑艺术的敬畏之情。 想象一下,如果将这份震撼与敬仰融入到你的演示文稿中,那将是多么引人入胜的体验。而这一切,只需借助AI生成PP…

Kubernetes 运维工程师必备:K8s 基础面试题精编(三)

Kubernetes 运维工程师必备:K8s 基础面试题精编(三) 1. 在Kubernetes集群中如何查看Pod的日志?2. 如何将一个已经部署的应用程序从一个命名空间迁移到另一个命名空间?3. 如何更新Kubernetes集群中的应用程序镜像版本?4. 如何通过Kubernetes进行自动扩容?5. 如何手动扩容…

震惊!!大模型玩转JS逆向

不知道大家有没有被JS代码混淆折磨过,我之前搞爬虫的时候,也经常被OB代码混淆搞到心态崩溃,但是自从接触了大模型,腰不疼了,腿不酸了,OB代码直接交给大模型,简直不要太爽 这是一段经过OB混淆之…

盘点12个国内外主流CRM系统,哪一个能免费试用?

客户关系管理(CRM)系统已成为企业成功的关键工具。它们不仅帮助企业改善客户关系,还提高了销售效率和业务分析能力。在众多选择中,我们特意盘点了12个国内外主流的CRM系统,从地位、业务应用以及特点三方面进行解析&…

车牌号字符检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

车牌号字符检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着智能交通系统的快速发展,车牌号字…

代码随想录算法训练营第 50 天 |98. 所有可达路径

代码随想录算法训练营 Day50 代码随想录算法训练营第 50 天 |98. 所有可达路径 目录 代码随想录算法训练营前言LeetCode98. 所有可达路径 一、图论基础概念1、图的种类2、度3、连通性:节点的连通情况4、图的构造5、图的遍历方式 二、深度优先搜索1、深度优先搜索的…

最全诗词近10万诗词大全ACCESS\EXCEL数据库

其实破解弄到这个数据库我没有多少喜悦,原因是我已有的一些诗词比如全唐诗、全宋词等加起来的话也差不多这个数,但是因为这个数据库是完整破解的,比自己用已有的诗词数据库整合来说更加的好; 分类情况统计:汉代诗词&am…

v500大程序之IIC调试

虽然写的是IIC,但其实在system bd中并没有勾选IIC0、IIC1,而是根据IIC协议写了相关的函数(不是我写的)。 用到的RTC是DS3231芯片。 目前遇到的问题是: zynq调试成功;fmql调试失败,其中年、日、…

【AD24报错】原理图编译后出现Off grid ## at的解决方案

【AD24报错】原理图编译后出现Off grid ## at的解决方案 在使用AD24进行原理图设计过程中,编译时出现Off grid ## at…错误。 1 错误原因 (1)元件放置不准确 在放置元件时,如果没有将元件的引脚或中心点准确地放置在网格点上&…

进程的创建、终止

目录 前言1. 进程创建2. 进程终止3. exit && _exit 的异同3.1 相同点3.2 不同点 前言 紧接着进程地址空间之后,我们这篇文章开始谈论进程控制相关的内容,其中包括进程是如何创建的,进程终止的几种情况,以及进程异常终止的…

基于vue框架的比赛门票出售的系统12lh6(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,赛事类型,赛事信息,比赛队伍,比赛结果 开题报告内容 基于Vue框架的比赛门票出售系统开题报告 一、研究背景与意义 随着体育产业的蓬勃发展,各类体育赛事如雨后春笋般涌现,吸引了全球亿万观众的关注与参与…

域控ntdsutil修改架构、域命名、PDC、RID、结构主机

#笔记记录# 五大操作主机角色 架构主机(schema master)域命名主机(naming master)RID主机(RID master)基础架构主机(infrastructure master)PDC仿真器主机(PDC&#xf…

算法力扣刷题记录 八十九【332.重新安排行程】

前言 回溯章节第13篇。 记录 八十九【332.重新安排行程】 一、题目阅读 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场&am…

全网最全的Fiddler抓包的详细教学-直接收藏!

一、Fiddler与其他抓包工具的区别 c 2、Wireshark是通用的抓包工具,能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,但如果是TCP、UDP协议可以用wireshark; 3、Httpwatch也…

豆包大模型迎来多维升级:综合性能提升20.3% 零售、汽车等行业落地提速

2024年无疑是科技行业公认的“AI大模型落地元年”,大模型应用的供需关系正在经历着前所未有的变化。 与过去AI厂商单方面探索应用场景的做法不同,今年我们见证了更多的重要行业和头部企业,在降本提效、以技术驱动新发展和新升级的需求之下&a…

AI开发者大赛 | 6道算法赛题上新

2024 AI开发者大赛正在如火如荼地进行着,本届比赛吸引了全球范围内的众多优秀开发者参与其中,用代码书写未来,用算法改变世界。 如今,算法赛新一批赛题上线,无论是初学者还是资深开发者,你都可以在2024 AI…

vue3实现系统tab标签页面切换

功能: 支持刷新当前、关闭其他、关闭全部、关闭当前支持打开多个相同path不同路由参数的页面,将fullPath作为路由页面唯一值 UI组件: 使用的是element-plus中的el-tab组件,结构目录如下 代码实现: 下面是 TagsView…

MATLAB水果分级系统

课题介绍 现在商业行为中,在水果出厂前都需要进行质量检测,需要将不同等级的水果进行分级包装,以保证商业利益最大化。可是传统方法都是依靠人工进行检测,效率低下,主观成分大,并不能很好客观地评价出货质…

适用于 Windows 10/11 的 2 大文件恢复软件

我很遗憾我在 Windows 10 中删除了 PC 中的数据并再次移动了它们。当我检查时,什么都没有。是否有任何Windows数据恢复软件,或者是否可以想象?我都会看到任何援助的价值。 文档、图像、音频等数据文件可能会因不良或危险行为而丢失&#xff…

Ollama 部署大模型

由于每次调用 OpenAI 等大模型都会产生费用,这个成本问题可以在开发环节可以通过私有化部署 LLM 的方式来避免。 Ollama 简介 Ollama 是一个开源的大型语言模型服务工具,专注于在本地运行大型语言模型。用户可以通过简单的安装指令在本地运行开源大型语…