使用matplotlib显示稀疏箭袋箭头

时间:2017-03-14 03:55:13

标签: python matplotlib gradient

在图像上使用箭头说明渐变时,箭头非常密集。我如何显示总趋势而不是每个箭头?

例如,在此图像中显示渐变的箭头箭头:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

image = Image.open('test.png')
array = np.array(image)
array = array[:,:,1]
array = array.astype(float)
dy, dx = np.gradient(array)

plt.figure(figsize=(10, 10))
plt.imshow(array)
plt.quiver(dx, -dy)
plt.show()

enter image description here enter image description here

虽然我希望箭头更大更稀疏,如下所示: enter image description here

添加

Y, X = np.mgrid[0:50:5, 0:50:5]
plt.quiver(X, Y, dx[::5, ::5], -dy[::5, ::5])

产生奇怪的结果

enter image description here

1 个答案:

答案 0 :(得分:1)

quiver图有一个参数scale。来自♦the documentation

  

比例:[无|漂浮]
  每箭头长度单位的数据单位,例如每个绘图宽度的m / s;较小的比例参数使箭头更长。如果为None,则使用简单的自动缩放算法,基于平均向量长度和向量的数量。

将此比例设置为合理的值,也可让图表显得更好。另请查看其他参数,例如scale_unitsunits

enter image description here

import numpy as np
import matplotlib.pyplot as plt

f = lambda x,y, x0,y0, sig: np.exp((-(x-x0)**2- (y-y0)**2)/sig**2)
X,Y = np.meshgrid(np.arange(50), np.arange(50))
array = f(X,Y, 24,24,7.)

dy, dx = np.gradient(array)

n = 3
plt.figure(figsize=(7, 7))
plt.imshow(array)
plt.quiver(X[::n,::n],Y[::n,::n],dx[::n,::n], -dy[::n,::n], 
           np.sqrt(dx[::n,::n]**2+dy[::n,::n]**2),
           units="xy", scale=0.04, cmap="Reds")
plt.show()