You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:06:22