以物理单位重新调整箭头箭头,使其与轴的纵横比

时间:2018-04-17 21:09:15

标签: python matplotlib vector

过去几个小时我一直在尝试自定义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]")

Contour plot with quiver overlaying it

将箭头选项设置为以下内容仅为箭头提供了点:

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.)

enter image description here

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

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

quiver documentation说:

  

要在x-y平面中绘制矢量,u和v具有与x和y相同的单位,请使用angles='xy'scale_units='xy'scale=1

因此,使用此参数可以解决您的问题。这是因为关键字units影响箭头尺寸除长度,而scale_units影响长度。

编辑:

matplotlib的箭袋

的参数行为示例

确实文档并不完全清楚,并且有许多具有相似名称的参数除此之外,对于箭头来说是唯一的。

下面有许多不同参数行为的示例,特别是此问题所关注的参数:anglesunitsscale_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度角。

angles

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则有一些,但很难解释为宽度未知

units

可以看出,由于绘图轴比较高,设置单位为“宽度”。与“长度”相比,产生更粗的箭头,因为宽度相同。比较&#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;。

scale_units

可以看出,&#39; y&#39;由于U,V向量之间的大小差异大约为5,y大小在-150和150之间,因此,使得arros看起来像点,而在宽度&#39;和&#39; lenght&#39;,绘图轴大小的5倍使箭头变大。