Поскольку Cartopy
не предоставляет ни одного шага для удовлетворения ваших требований, вам необходимо создать функцию, которая объединяет в себе необходимые операции.Здесь я предлагаю рабочий код, который делает то, что вам нужно.Ищите функцию vectrans()
внутри кода.
import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs
import numpy as np
num = 12 # number of points to plot for demo
scale = 7 # scale to get proper sizes of barbs
# generate (u,v) vector components
us, vs = (np.random.random([num])-0.5)*scale, (np.random.random([num])-0.5)*scale
# generate (lons,lats) accompanying the vectors
lons = np.linspace(-120, 170, num)
lats = np.ones(num)*40
# create source and target projections
srcProj = ccrs.PlateCarree() # basic values: long, lat (equivalent)
tgtProj = ccrs.Robinson()
# here is a function to emulate `transform_vector`
def vectrans(u, v, lons, lats):
u_tgt, v_tgt = tgtProj.transform_vectors(srcProj, lons, lats, u, v)
xyz = tgtProj.transform_points(srcProj, lons, lats)
x_tgt = xyz[:,0]
y_tgt = xyz[:,1]
return x_tgt, y_tgt, u_tgt, v_tgt
# setup fig/axis and plot the meshgrid of points
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=tgtProj)
ax.add_feature(cartopy.feature.LAND, facecolor='lightgray')
# use vectrans() to get values for barbs plotting
tgt_x, tgt_y, u_tgt, v_tgt = vectrans(us, vs, lons, lats)
# plot points and barbs
ax.scatter(tgt_x, tgt_y, s=7, c="k", zorder=10)
ax.barbs(tgt_x, tgt_y, u_tgt, v_tgt, barbcolor='firebrick', flagcolor='firebrick', pivot='middle',
linewidths=1, zorder=11)
ax.set_global()
plt.show()