如何使用matplotlib箭袋比例

时间:2015-12-01 16:34:46

标签: python matplotlib plot

我需要做一系列矢量图。我可以使用matplotlib的箭头例程获得任意数量的图表。问题是,每个情节都有箭头,但是我需要每个情节中的矢量都代表相同的比例。例如,如果在一个图中10km / hr由1cm的矢量表示,则在所有图中10km / hr应由1cm矢量表示。 (我不太关心矢量是否特别是1厘米。这只是一个例子。)我想我可以通过分别调整每个情节的比例参数来实现这一点。但它似乎不起作用。

例如,我在第一个图中找到最大速度mxs1,然后在每个图中我做了类似的事情

mxspd = np.max(speed[n])
pylab.quiver(x,y,vx[n],vy[n],scale=mxs1/mxspd)

但这并不足以调整向量的长度。例如,在我尝试的情况下,mxspd约为mxs1的一半,因此情节n中的向量应该是第一个图中的向量的一半左右。但是这两个图中的向量具有几乎相同的长度。

3 个答案:

答案 0 :(得分:3)

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

x, y = np.mgrid[0:20, 0:25]
u = np.sin(2 *x * np.pi / 20)
v = np.cos(2 * y * np.pi / 25)

fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(8, 4))

ax_r.quiver(x, y, u, v, scale=5, scale_units='inches')
ax_l.quiver(x, y, 2*u, 2*v, scale=5, scale_units='inches')

ax_l.set_title('2x')
ax_r.set_title('1x')

enter image description here

有关scalescale_units kwargs的解释,请参阅documentation

答案 1 :(得分:2)

上面的答案与两个地块先验的比例相匹配。

下面的解决方案通过从第一个绘图中自动确定的比例并将其应用到第二个图表来匹配比例 a posteri

这可能并不总是有效,因为它使用私人电话,但解决了我的问题。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

x, y = np.mgrid[0:20, 0:25]
u = np.sin(2 *x * np.pi / 20)
v = np.cos(2 * y * np.pi / 25)

fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(8, 4))

Q = ax_r.quiver(x, y, u, v, scale=None, scale_units='inches')

Q._init()
assert isinstance(Q.scale, float)

ax_l.quiver(x, y, 2*u, 2*v, scale=Q.scale, scale_units='inches')

ax_l.set_title('2x')
ax_r.set_title('1x')

Image showing the two plots with matching scales.

答案 2 :(得分:1)

这个缩放问题让我困惑了好久。一般来说,我想要一个键,上面写着“这个箭头的长度等于这个速度”,这意味着:

  1. 很高兴使用 quiverkey 添加密钥
  2. 有时设置 angles='xy', scale_units='xy' 会很有帮助,以使用 x 和 y 单位而不是固定单位来绘制箭头。例如,如果轴以米为单位,而您想要 m/s

因此,如果我们假设假的 u,v 数据的单位为 m/s,我会按如下方式调整 tacaswell 的答案(这里的比例固定为 1)。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

x, y = np.mgrid[0:20, 0:25]

u = np.sin(2 *x * np.pi / 20)
v = np.cos(2 * y * np.pi / 25)

fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(8, 4))

# set the key length
lkey=1

#set the scale factor
scalef=1

q_l=ax_l.quiver(x, y, 2*u, 2*v, angles='xy', scale_units='xy' , scale=scalef)
ax_l.quiverkey(q_l, X=0.3, Y=1.1, U=lkey,
             label='Quiver key, length = '+str(lkey)+' m/s', labelpos='E')

q_r=ax_r.quiver(x, y, u, v, angles='xy', scale_units='xy', scale=scalef )

ax_r.quiverkey(q_r, X=0.3, Y=1.1, U=lkey,
             label='Quiver key, length = '+str(lkey)+' m/s', labelpos='E')

ax_l.set_title('2x')
ax_r.set_title('1x')

给予:

enter image description here

也就是说,通常您可能希望使用自动比例因子,然后调整键,因为这可以防止箭头重叠和手动调整比例因子。为了进一步说明这一点,我将数据按 5 倍缩放:

u = 5*np.sin(2 *x * np.pi / 20)
v = 5*np.cos(2 * y * np.pi / 25)

现在左侧面板的最大速度为 10 m/s(加倍)

所以如果我们设置以下选项:

lkey=10

#set the scale factor to None for autoscaling
scalef=None

然后我们得到以下内容:

enter image description here

所以这里的图看起来一样,但左键上的箭头正确地是右键长度的一半。