python - 协调 basemap 箭袋和 matplotlib 箭头

标签 python numpy matplotlib matplotlib-basemap

我正在尝试比较 matplotlib 中网格模型输出位置(通过 basemap map 上的箭袋)和分散站(通过 matplotlib 箭头)之间的风矢量。两者的位置均以纬度/经度为单位,但风矢量的单位为米/秒。

组合时,我希望颜色和长度随大小变化,并且对于箭袋和箭头数据,两种质量都以相同的方式缩放。我在下面给出了一个示例,其中颤动图看起来不错,并且按绝对长度(英寸)缩放。我不知道如何使 arrow() 匹配。在示例中,我将其除以 SCALE,以了解我希望最终图像的外观。

import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.basemap import Basemap

X, Y = np.meshgrid(np.arange(-123,-121,0.3),np.arange(37,39,0.3))
U = np.cos(X+123)*12
V = np.sin(Y-37)*12
mag = np.hypot(U,V)

fig,ax=plt.subplots(1)
m=Basemap(projection ='cyl',resolution='f',llcrnrlat=37,llcrnrlon=-123,
          urcrnrlat=39,urcrnrlon=-121,ax=ax)

quiv = m.quiver(X,Y,U,V,mag,zorder=2,latlon=True,scale=30,scale_units='inches')

# Scattered points won't be on the grid
x0=X[2,2] - 0.025
y0=Y[2,2]

u0=U[2,2]
v0=V[2,2] + 0.5 
SCALE = 72.
plt.arrow(x0,y0,u0/SCALE,v0/SCALE)

plt.show()

最佳答案

从 matplotlib 文档中还不是很清楚(在我看来),但是 quiver 确实接受所有 X、Y、U 和 V 的一维数组,这确实不需要均匀间隔。 basemap 文档出现了错误,或者至少更加不清楚。因此,只要将分散的站点数据形成一维数组,就应该没问题。

我通过用此替换散点部分向您的绘图添加了一些随机箭头(如果您使用相同的种子,您应该得到相同的箭头):

# Make scattered locations
np.random.seed(33)
x0 = np.random.rand(5)*2.0 - 123
y0 = np.random.rand(5)*2.0 + 37

# Make some velocities
u0 = np.random.randn(5)*3 + 10
v0 = np.random.randn(5)*3 + 10

q2 = m.quiver(x0, y0, u0, v0, latlon=True, scale=30, scale_units='inches')

这是我得到的图(我默认使用 YlGnBu_r 颜色图)。 regular grid plus scattered locations

请注意,如果您开始使用圆柱型投影以外的任何东西(并且如果您的 U 和 V 以东西向和南北向表示),您将需要使用以下方法旋转矢量以匹配投影: rotate_vector方法。

关于python - 协调 basemap 箭袋和 matplotlib 箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408942/

相关文章:

python - BeautifulSoup 中带有 .get-operator 的 if 语句

python - 网络抓取更新值

numpy - 用meshgrid和imshow绘图

python - 当 io.py 在同一目录中时,pandas ImportError C 扩展

python - 如何在matplotlib中获得平滑的填充轮廓?

python - 在 matplotlib 中单独设置 xticklabels 的颜色

python - 如何向类 View 添加逻辑

python - Numpy 元素乘法,具有多列

python - 使用 matplotlib 创建条形图,其中 x 轴为日期,宽度为时间增量

python - 使用日志记录的 TimedRotatingFileHandler 创建 .log 文件