#读取数据
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一个吧
上侧的图是
ax.quiver(x, 0, u, v, color=‘r’) #没有选择y轴
下侧的图则是选择y轴后的结果,矢量箭头的尾部位置代表这一小时风速的大小
ax.quiver(x, y, u, v, color=‘r’)