如何在Python中基于经纬度数据绘制风矢(Quiver)图?
基于经纬度绘制二维风矢图(从风向风速转换到u/v分量)
一、核心:将气象风向风速转换为u/v分量
气象学中,风向是风来的方向(正北为0°,顺时针递增),而quiver需要的是风去向的东向(u,东为正)和北向(v,北为正)分量,转换公式如下:
import numpy as np # 角度转弧度 wind_dir_rad = np.deg2rad(wind_direction) # 计算u、v分量 u = -wind_speed * np.sin(wind_dir_rad) v = -wind_speed * np.cos(wind_dir_rad)
- 符号说明:负号是因为风向代表风的来向,取反后得到风的去向分量,与
quiver的坐标方向匹配。 - 单位:风速单位为kts时,转换后u/v的单位也为kts,无需额外转换。
二、完整绘图流程(Python + Cartopy)
1. 导入依赖库
import pandas as pd import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature
2. 读取并预处理数据
假设你的数据是空格分隔的文本文件:
# 读取数据,自动识别空格分隔 df = pd.read_table('wind_data.txt', sep='\s+', header=0) # 重命名列名简化操作 df.columns = ['lat', 'lon', 'wind_dir', 'wind_speed'] # 处理缺失值(如果有) df = df.dropna(subset=['lat', 'lon', 'wind_dir', 'wind_speed'])
3. 计算u/v分量
df['wind_dir_rad'] = np.deg2rad(df['wind_dir']) df['u'] = -df['wind_speed'] * np.sin(df['wind_dir_rad']) df['v'] = -df['wind_speed'] * np.cos(df['wind_dir_rad'])
4. 绘制带风矢的地图
# 设置地图投影(等距圆柱投影,适配经纬度数据) proj = ccrs.PlateCarree() # 创建画布和轴 fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': proj}) # 添加地理要素:海岸线、陆地、海洋 ax.add_feature(cfeature.COASTLINE, linewidth=0.8) ax.add_feature(cfeature.LAND, facecolor='lightgray') ax.add_feature(cfeature.OCEAN, facecolor='lightblue') # 设置地图显示范围(基于数据的经纬度自动调整) lon_min, lon_max = df['lon'].min() - 1, df['lon'].max() + 1 lat_min, lat_max = df['lat'].min() - 1, df['lat'].max() + 1 ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=proj) # 绘制风矢:箭头颜色映射风速大小 quiver_plot = ax.quiver( df['lon'], df['lat'], df['u'], df['v'], df['wind_speed'], # 颜色对应风速 cmap='viridis', scale=150, # 调整箭头长度,数值越大箭头越短,根据风速范围微调 scale_units='inches', transform=proj # 指定数据的投影(经纬度对应PlateCarree) ) # 添加颜色条 plt.colorbar(quiver_plot, label='Wind Speed (kts)', shrink=0.8) # 添加标题 ax.set_title('Wind Vectors (Direction: Wind From, Speed: kts)') plt.show()
三、关键参数说明
scale:控制箭头长度,若风速普遍较大(如30-50kts),可增大scale值(如200)避免箭头重叠;风速小则减小该值。cmap:颜色映射方案,可替换为plasma、coolwarm等其他matplotlib配色。- 若使用旧版
Basemap而非Cartopy,仅需修改地图投影和要素添加的代码,u/v分量的转换逻辑完全一致。
内容的提问来源于stack exchange,提问作者thereiswaldo
相关产品推荐
相关产品推荐

