过去几个小时我一直在尝试自定义matplotlib.quiver
而没有太多运气。文档很混乱,我无法解析如何设置每个参数。在我的轴上,一个垂直像素的物理距离比一个水平像素小得多,我希望箭头将箭头自动缩放到这个宽高比。我目前得到的是带有以下代码的水平箭头:
Tlevs = np.arange(-1.,8.5,.5) + 0.
yy, zz = np.meshgrid(ds.YC, ds.Z)
fig, ax = plt.subplots(figsize=(8,5))
fig.set_tight_layout(True)
im = ax.contourf(T_clim.YC, T_clim.Z, T_clim, levels=Tlevs)
ax.quiver(yy[::3,::10], zz[::3,::10],
vpFep_b[::3,::10], wpFep_b[::3,::10],
pivot='mid', angles='xy', units='xy')
ax.set_xlabel('Y [m]', fontsize=13)
ax.set_ylabel('Depth [m]', fontsize=13)
cbar = fig.colorbar(im, ax=ax)
cbar.set_label(r"[$^\circ$C]")
将箭头选项设置为以下内容仅为箭头提供了点:
ax.quiver(yy[::3,::10], zz[::3,::10],
vpFep_b[::3,::10], wpFep_b[::3,::10],
pivot='mid', angles='xy', scale_units='xy', scales=1.)
和
ax.quiver(yy[::3,::10], zz[::3,::10],
vpFep_b[::3,::10], wpFep_b[::3,::10],
pivot='mid', angles='xy', scale_units='xy')
给出以下错误:
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:666: RuntimeWarning: divide by zero encountered in double_scalars
length = a * (widthu_per_lenu / (self.scale * self.width))
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:666: RuntimeWarning: invalid value encountered in multiply
length = a * (widthu_per_lenu / (self.scale * self.width))
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:719: RuntimeWarning: invalid value encountered in less
short = np.repeat(length < minsh, 8, axis=1)
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:733: RuntimeWarning: invalid value encountered in less
tooshort = length < self.minlength
任何帮助将不胜感激。谢谢!
答案 0 :(得分:3)
要在x-y平面中绘制矢量,u和v具有与x和y相同的单位,请使用
angles='xy'
,scale_units='xy'
,scale=1
因此,使用此参数可以解决您的问题。这是因为关键字units
影响箭头尺寸除长度,而scale_units
影响仅长度。
确实文档并不完全清楚,并且有许多具有相似名称的参数除此之外,对于箭头来说是唯一的。
下面有许多不同参数行为的示例,特别是此问题所关注的参数:angles
,units
和scale_units
。每个示例都有一个可以通过单击扩展的图像。
所有图的数据都是相同的,可以使用以下代码重现:
x = np.linspace(0,50,5)
y = np.linspace(-150,150,7)
X,Y = np.meshgrid(x,y)
U = 3.5*np.ones_like(X)
V = 3.5*np.ones_like(Y)
angles
文件中的条目是:
角度:['uv'| 'xy'],数组,可选
确定箭头角度的方法。默认为'uv'。
'uv':箭头轴纵横比为1,因此如果U * == * V,则绘图上箭头的方向与水平轴逆时针呈45度(正向右)。
'xy':箭头从(x,y)指向(x + u,y + v)。例如,使用它来绘制渐变场。
在我们的例子中,U和V之间的比率为1,因此箭头将指向“uv”中的45度。然而,在&#39; xy&#39;在这种情况下,由于y轴和x轴的范围不同,箭头不会指向45度,以保持从(x,y)到(x + u,y + v)的位移。这一点很重要,因为根据轴纵横比,梯度(u,v)=(1,1)不会有45度角。
units
文档的条目是:
单位:['width'| '身高'| '点'| 'inches'| 'x'| 'y'| 'xy']
箭头尺寸(长度除外)以此单位的倍数计算。
'width'或'height':轴的宽度或高度
'dots'或'inches':像素或英寸,基于图dpi
'x','y'或'xy':分别为X,Y或数据单位
箭头根据单位的不同而不同。对于'x'或'y',随着一个放大,箭头会变大;对于其他单位,箭头大小与缩放状态无关。对于“宽度”或“高度”,当调整窗口大小时,箭头大小分别随轴的宽度和高度增加;对于'点'或'英寸',调整大小不会改变箭头。
如上所述,该参数定义了测量除箭头长度之外的所有尺寸的单位。但是,参数宽度(自箭头宽度和头长等以来最相关的定义为它的倍数)具有默认值,这取决于使用的单位。
下面是一个不同单位的示例,将宽度固定为可比较的情况。参数点或英寸几乎相等,因此在该示例中仅考虑其中一个。因此,宽度设置为0.01,宽度为&#39;和&#39;高度&#39;,3为&#39;点&#39;和&#39; x&#39;,&#39; y&#39;和&#39; xy&#39;。不固定相同的宽度会产生不同的结果,具体取决于后端:即jupyter中的matplotlib inline在任何情况下都没有区别,而Qt5则有一些,但很难解释为宽度未知
可以看出,由于绘图轴比较高,设置单位为“宽度”。与“长度”相比,产生更粗的箭头,因为宽度相同。比较&#39; x&#39;,&#39; y&#39;和&#39; xy&#39;,根据x轴测量的距离1比根据y轴的距离1大得多。
scale_units
文档中的条目是:
scale_units:['width'| '身高'| '点'| 'inches'| 'x'| 'y'| 'xy'],无,可选
如果比例kwarg为None,则为箭头长度单位。默认值为“无”。
e.g。 scale_units为'inches',scale为2.0,(u,v)=(1,0),则向量为0.5英寸长。
如果scale_units是'width'/'height',那么向量将是轴的宽度/高度的一半。
如果scale_units为'x',则向量将为0.5 x轴单位。要在xy平面中绘制矢量,u和v具有与x和y相同的单位,请使用角度=&#39; xy&#39;,scale_units =&#39; xy&#39;,scale = 1。
调整绘图大小时缩放的说明与单位相同。然而,&#34;如果规模kwarg是None&#34;声明完全不清楚并导致错误。
如果scale为None,则箭头的长度将根据scale_units设置为默认值,以便在宽度和高度之间保持合理的比例并保持箭头的良好形状(即合理的头部)。然后,scale_units不会被适当地升值,直到调整绘图大小(由于缩放的差异取决于scale_units)。
如果scale不同于None,则箭头长度不再设置为其默认值,它遵循文档中的示例。
下面是比较scale_units的不同值的图表,scale = 1,单位设置为默认值&#39; width&#39;。
可以看出,&#39; y&#39;由于U,V向量之间的大小差异大约为5,y大小在-150和150之间,因此,使得arros看起来像点,而在宽度&#39;和&#39; lenght&#39;,绘图轴大小的5倍使箭头变大。