import numpy as np
import matplotlib.pyplot as plt
from 向量单位化 import mat_u
from scipy.io import loadmat
filename=r'D:\Program Files\Polyspace\R2021a\bin\learning\quiver\uvssh.mat'
data=loadmat(filename)
lon=np.mat(data['lon'].T)
lat=np.mat(data['lat'].T)
u=np.mat(data['u'][:,:,1].T)
u[u==0]=np.nan
v=np.mat(data['v'][:,:,1].T)
v[v==0]=np.nan
u=u.reshape(-1)
v=v.reshape(-1)
uv=np.array(np.concatenate((u,v),0))
uv=mat_u(uv)
uv=np.mat(uv)
u=uv[0,:].reshape((1440,720))
v=uv[1,:].reshape((1440,720))
print(lon.shape,lat.shape,u.shape,v.shape)
# plt.quiver(lon[0,0::10].T,lat[0,0::10].T,u[0::10,0::10],v[0::10,0::10])
plt.quiver(lon,lat,u,v)
plt.show()
(1, 1440) (1, 720) (1440, 720) (1440, 720)
ValueError: Argument U has a size 1036800 which does not match 1, the number of arrow positions
该回答引用ChatGPT
根据报错信息,问题出在quiver函数的参数U上。从代码中可以看出,lon和lat的shape是(1,1440)和(1,720),而u和v的shape是(1440,720),也就是说,u和v的shape与lon和lat的shape不匹配。
对于quiver函数,它的前两个参数x和y代表箭头的起点坐标,而第三个参数U和第四个参数V代表箭头的长度和方向,它们的shape应该与x和y相同。因此,需要将lon和lat变成与u和v相同的shape,可以使用np.meshgrid函数实现:
lon, lat = np.meshgrid(lon, lat)
这样可以将lon和lat的shape变为(720,1440),与u和v的shape相同。修改后的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from 向量单位化 import mat_u
from scipy.io import loadmat
filename = r'D:\Program Files\Polyspace\R2021a\bin\learning\quiver\uvssh.mat'
data = loadmat(filename)
lon = np.mat(data['lon'].T)
lat = np.mat(data['lat'].T)
u = np.mat(data['u'][:, :, 1].T)
u[u == 0] = np.nan
v = np.mat(data['v'][:, :, 1].T)
v[v == 0] = np.nan
u = u.reshape(-1)
v = v.reshape(-1)
uv = np.array(np.concatenate((u, v), 0))
uv = mat_u(uv)
uv = np.mat(uv)
u = uv[0, :].reshape((1440, 720))
v = uv[1, :].reshape((1440, 720))
lon, lat = np.meshgrid(lon, lat)
plt.quiver(lon, lat, u, v)
plt.show()