我想利用底图的transform_vector函数及其返回x和y的能力(在cartopy中绘制倒钩)
这是底图中的代码
u1, v1, x1, y1 = bm.transform_vector(u, v, self.lons, self.lats, 16, 16,
returnxy=True)
bm.barbs(x1, y1, u1, v1,
barbcolor='firebrick', flagcolor='firebrick', pivot='middle',
linewidths=1)
我想在cartopy中实现此目的,但是cartopy中的transform_vectors没有returnxy的选项,那么我该怎么做?假设我们已经有u,v,self.lons和self.lats
答案 0 :(得分:1)
由于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()