tak*_*nbo 1 python vector matplotlib
在过去的几个小时中,我一直在尝试自定义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]")
Run Code Online (Sandbox Code Playgroud)
将quiver选项设置为以下选项只会给出箭头应为的点:
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.)
Run Code Online (Sandbox Code Playgroud)
和:
ax.quiver(yy[::3,::10], zz[::3,::10],
vpFep_b[::3,::10], wpFep_b[::3,::10],
pivot='mid', angles='xy', scale_units='xy')
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
/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
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。谢谢!
该quiver文件说:
在xy平面内积向量,其中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)
Run Code Online (Sandbox Code Playgroud)
angles文档中的条目是:
角度:['uv'| 'xy'],数组,可选
确定箭头角度的方法。默认值为“ uv”。
'uv':箭头轴的长宽比为1,因此,如果U * == * V,则图中箭头的方向与水平轴逆时针成45度(正)。
'xy':箭头从(x,y)指向(x + u,y + v)。例如,用它来绘制梯度场。
在我们的情况下,U与V之比为1,因此在“ uv”情况下箭头将指向45度,但是在“ xy”情况下,由于y和x轴的范围不同,因此箭头箭头不会指向45度,以保持从(x,y)到(x + u,y + v)的位移。考虑到这一点很重要,因为根据轴的纵横比,坡度(u,v)=(1,1)不会具有45度角。
units该文档的条目是:
单位:['宽度'| '身高'| '点'| “英寸” | 'x'| 'y'| 'xy']
箭头尺寸(长度除外)以该单位的倍数测量。
“宽度”或“高度”:轴的宽度或高度
“点”或“英寸”:像素或英寸,基于数字dpi
'x','y'或'xy':分别为X,Y或数据单位
箭头的缩放取决于单位。对于“ x”或“ y”,箭头会随着放大而变大。对于其他单位,箭头大小与缩放状态无关。对于“宽度”或“高度”,当调整窗口大小时,箭头的大小分别随轴的宽度和高度增加。对于“点”或“英寸”,调整大小不会更改箭头。
如上所述,此参数定义了单位,在其中测量除箭头长度以外的所有尺寸。但是,参数width(由于箭头的headwidth和headlength等定义为其倍数,因此是最相关的)具有默认值,具体取决于使用的单位。
下面是一个不同单位的示例,将宽度固定为可比较的情况。参数点或英寸几乎相等,因此在示例中仅考虑其中之一。因此,将“宽度”和“高度”的宽度设置为0.01,将“点”设置为3,将“ x”,“ y”和“ xy”设置为2。不固定相同的宽度会产生不同的结果,具体取决于后端:即,在jupyter中使用matplotlib内联时,在任何情况下都没有差异,而对于Qt5,则存在一些差异,但是由于宽度未知,很难解释。
可以看出,随着绘图轴的宽度大于高度,将单位设置为“宽度”会比“长度”产生更粗的箭头,因为宽度是相同的。比较“ x”,“ y”和“ xy”时也是如此,根据x轴测量的距离1远大于根据y轴测量的距离1。
scale_units文档中的条目是:
scale_units:['宽度'| '身高'| '点'| “英寸” | 'x'| 'y'| 'xy'],无,可选
如果刻度kwarg为“无”,则箭头长度单位。默认为无。
例如scale_units为“英寸”,比例为2.0,并且(u,v)=(1,0),则矢量将为0.5英寸长。
如果scale_units为'width'/'height',则向量将为轴的宽度/高度的一半。
如果scale_units为'x',则矢量将为0.5 x轴单位。要在xy平面上绘制矢量,并且u和v具有与x和y相同的单位,请使用angles ='xy',scale_units ='xy',scale = 1。
调整图大小时有关缩放的说明与单位相同。但是,“如果刻度kwarg为None”语句完全不清楚,并会导致错误。
如果scale为None,则箭头的长度将根据scale_units设置为默认值,以保持宽度和高度之间的合理比例,并使箭头保持良好的形状(即,合理的头部)。然后,在调整图的大小之前(由于缩放比例取决于scale_units的不同),scale_units才能得到正确的欣赏。
如果小数位数不同于无,则箭头长度不再设置为其默认值,它遵循文档中的示例。
下面是一个比较scale_units不同值的图,其中scale = 1,单位设置为其默认值“ width”。
可以看到,由于U,V向量之间的大小差异约为5,而y尺度介于-150和150之间,因此,“ y”情况使arros看起来像点。表示“宽度”和“长度”,即绘图轴大小的5倍使箭头很大。
| 归档时间: |
|
| 查看次数: |
1817 次 |
| 最近记录: |