我已经尝试在 Cartopy 中绘制带有不确定性椭圆的矢量场有一段时间了。这个想法是,如果我有一个位置(纬度/经度)和一个向量(例如风速),但该向量具有不确定性(例如以标准差测量),那么我想绘制一个椭圆周围的箭头表示不确定性。在格林尼治标准时间,psvelo
成功了,我的目标是像这样的东西 https://www.researchgate.net/figure/GPS-velocities-and-their-95-confidence-ellipses-in-a-Eurasia-fixed-reference-frame_fig1_331309175.
这与之前被问过的问题相同here https://stackoverflow.com/questions/37418479/how-to-plot-a-vector-field-with-error-ellipse-using-cartopy- 我重新打开它是因为我认为如果有人可以帮助我更好地理解变换并且我可以找到箭头尖端的位置,我可以自己绘制误差椭圆。另外,一些 Matplotlib/Cartopy 功能在过去 4 年中可能发生了变化。
所以,这是我到目前为止所尝试的:
制作地图,使用 quiver 绘制矢量,然后尝试访问返回的某种比例参数Quiver
目的。我找不到任何有用的东西,尽管scale
属性看起来像是正确的事情,但事实证明它永远不会被设置,除非我自己设置它。
如果我自己设置缩放比例,如果我的位置和矢量具有不同的单位,并且两者显然与轴宽度无关,我不知道如何执行此操作。例如,如果我决定在 10°E、40°N 处有一个 50 m/s 长的矢量,作为轴宽度的某个分数,我会怎样scale
参数是?我尝试随机组合变换没有得到任何结果。 (这里的想法是,如果我能弄清楚这种关系,那么我就离知道将椭圆放在哪里更近了一步。)
我试图弄清楚quiver
的自动缩放,看看我如何“预测”它将在内部做什么,然后用它来知道箭头的尖端在哪里。可悲的是,这是不像 Matlab 变体那么简单 https://stackoverflow.com/questions/32436528/plotting-just-the-endpoint-of-quiver,所以我也失败了。
最后我也不明白为什么我不能使用cartopy.crs.Geodetic()
作为我的源坐标系。我得到的错误是invalid transform: Spherical quiver is not supported - consider using PlateCarree/RotatedPole.
通过阅读 Cartopy 文档,如果我的矢量位置以纬度、经度和高度来测量,这不是合适的吗?
这是一个 MWE:
# imports
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# data
lon, lat = np.array([10, 10.5]), np.array([40, 40])
east, north = np.array([0, 50]), np.array([50, 0])
# map
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.Mercator()})
ax.set_extent([7, 13, 38, 42], ccrs.Geodetic())
ax.coastlines("50m")
q = ax.quiver(lon, lat, east, north, transform=ccrs.PlateCarree())
plt.show()
我确实认为这是 Cartopy 应该具备的功能,因为这是我迄今为止在使用 Python 进行地球科学应用时遇到的最大障碍之一。目前,我知道的唯一方法是从 Python 程序中编写 GMT 脚本文件,并使用 Python 系统调用运行 GMT,这确实很痛苦。
我知道GMT正在开发自己的Python界面 https://github.com/GenericMappingTools/pygmt,但他们甚至还没有整合所有的基本功能,所以任何人都猜测他们什么时候会达到psvelo
...
感谢您的所有帮助和提示,
PBB