Cartopy:无法绘制具有不确定性的向量场(以及相关问题)

2024-06-01 13:50:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试用Cartopy中的不确定性椭圆绘制向量场。这个想法是,如果我有一个位置(纬度/经度)和一个向量(例如,风速),但该向量有一个不确定性(例如,以标准偏差测量),那么我想在箭头尖端绘制一个椭圆,表示不确定性。在GMT中,psvelo起了作用,我的目标是something like this

这与之前的问题相同here-我重新打开它,因为我认为如果有人能帮助我更好地理解变换,我可以找到箭头尖端的位置,我可以自己绘制错误椭圆。此外,某些Matplotlib/Cartopy功能在过去4年中可能已经发生了变化

以下是我到目前为止所做的尝试:

  1. 制作一张地图,使用quiver绘制向量,然后尝试访问返回的Quiver对象中的某种比例参数。我找不到任何有用的东西,尽管scale属性看起来是正确的,但结果证明,除非我自己设置,否则它永远不会被设置

  2. 如果我自己设置缩放,如果我的位置和向量有不同的单位,我不知道该怎么做,而且两者显然与轴宽度无关。例如,如果我决定在10°E,40°N处有一个50 m/s长的向量,作为轴宽度的一部分,我的scale参数是什么?我尝试变换的随机组合并没有得到任何结果。(这里的想法是,如果我能找出这个关系,那么我离知道椭圆放在哪里又近了一步。)

  3. 我试图找出quiver的自动缩放,看看我如何“预测”它在内部将做什么,然后用它来知道箭头的尖端在哪里。不幸的是,它是not as straightforward as the Matlab variant,所以我在这方面也失败了

  4. 最后,我也不明白为什么不能使用cartopy.crs.Geodetic()作为源坐标系。我从阅读Cartopy文档中得到的错误是invalid transform: Spherical quiver is not supported - consider using PlateCarree/RotatedPole.,如果向量的位置是用纬度、经度和海拔测量的,那么这不是合适的错误吗

这里有一个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 is developing their own Python interface,但他们甚至还没有整合所有的基本功能,所以任何人都可以猜测他们什么时候会到达psvelo

谢谢你的帮助和提示

多溴联苯


Tags: as错误np绘制箭头axarray向量
1条回答
网友
1楼 · 发布于 2024-06-01 13:50:13

最难的部分是matplotlib部分。如果我想做这件事,我会在用Cartopy制作之前先关注它。从技术上讲,您需要的点位于由quiver命令生成的路径集中的某个位置(位于MWE中的q._paths)。一个更简单的解决方案是使用pivot='tip',这样箭头的点总是位于(x,y)

当您尝试使用Geodetic时,从Cartopy中得到的错误是,在处理球体时,正确地执行所有操作都涉及更复杂的数学,因此并非所有操作都与Geodetic一起工作。如果改为使用PlateCarree,它会将lon/lat视为平面上的笛卡尔坐标

相关问题 更多 >