#读取数据

data = pd.read_excel('XXX.xlsx', sheet_name='Sheet0',usecols=['ID','hour', 'WS','WD'])
df = pd.DataFrame(data)

names = data['ID'].unique()
for name in names: 
    dt=data.loc[data['ID']==name,:] 
    
    # 计算每个站点的风速和风向的最小值和最大值
   # y_min, y_max = dt['WS'].min() - 0.5, dt['WS'].max() + 0.5  #设置y轴显示的范围

这里有两个细节,一是u和v分别对应的sin和cos函数,不能写反;二是公式应该是风速的负值*sin/cos(角度)

x = dt['hour']  #绘制的小时变化,需要读取时间    
    u = -dt['WS'] * np.sin(np.radians(dt['WD']))  # 将风向转换为x方向的分量    
    v = -dt['WS'] * np.cos(np.radians(dt['WD']))  # 将风向转换为y方向的分量

最后就是绘图了


x = dt['hour']  #绘制的小时变化,需要读取时间    
    u = -dt['WS'] * np.sin(np.radians(dt['WD']))  # 将风向转换为x方向的分量    
    v = -dt['WS'] * np.cos(np.radians(dt['WD']))  # 将风向转换为y方向的分量
    
    # 绘制quiver图
    fig, ax = plt.subplots(figsize=(12, 5))

    ax.quiver(x, 0, u, v, color='r')  # r表示红色矢量
        
    # 添加标题和轴标签
    ax.set_title(f'{name}风速风向矢量图',fontproperties="SimHei")
    ax.set_xlabel('Time (Hours)')
    ax.set_ylabel('Wind Speed (m/s)')
    #ax.set_xticks(np.arange(0, 24), [f'{h}:00' for h in range(1, 24)], fontproperties='SimHei',rotation=0)
    #ax.set_ylim(y_min, y_max)  # 设置y轴的范围
        
    # 显示图形
    plt.show()

这个代码还有不完善的地方,没有图例,未能表示风速值大小,后续有需要的话自己P一个吧

python 风向误差 验证统计 python 风向图_开发语言

python 风向误差 验证统计 python 风向图_python 风向误差 验证统计_02

上侧的图是

ax.quiver(x, 0, u, v, color=‘r’)   #没有选择y轴

下侧的图则是选择y轴后的结果,矢量箭头的尾部位置代表这一小时风速的大小
        ax.quiver(x, y, u, v, color=‘r’)