当值为零时,如何删除箭头箭头

时间:2018-02-14 08:29:01

标签: python python-3.x numpy matplotlib

我有一张大图像并且做这样的事情:

test = np.zeros((800,800))
quiver_v = np.zeros((2,800,800))
quiver_v[0, 300,300] = 10

plt.imshow(test)
plt.quiver(quiver_v[0],quiver_v[1], scale_units='xy', angles='xy', scale=0.1, width=0.001, color='red') 

plt.show()

我得到以下image

如何将背景设置为“白色”,或者当值为零时如何避免为箭袋绘制任何内容?

2 个答案:

答案 0 :(得分:1)

正如现在已删除的答案中所述,您需要过滤掉所有零长度向量。然而,我不是计算每个向量的欧几里德长度,而是检查每个向量分量对零,并掩盖那些所有分量都正好为零的向量。这样可以省去平方根和平方根。然后,您可以使用计算的掩码来过滤quiver_v值。但是,此屏蔽过程会返回1d有效值数组,因此为了在正确的位置显示箭头,您需要提供quiver命令及其坐标。这可以通过首先生成meshgrid坐标来完成,然后可以使用与quiver_v值相同的掩码进行过滤。这里有完整的例子:

请注意,imshow有点棘手,因为它会绕y轴转动。如果不需要,您可以改用ax.pcolormesh(idx_x,idx_y,test)。如果你需要"方形像素"代表imshow,您可以使用ax.set_aspect('equal')强制它。

from matplotlib import pyplot as plt
import numpy as np

xdim = 800
ydim = 800
test = np.zeros((xdim,ydim))
quiver_v = np.zeros((2,xdim,ydim))
quiver_v[0, 300,300] = 10

##produce a meshgrid of coordinates
idx_x = np.arange(xdim)
idx_y = np.arange(ydim)
idx_x,idx_y = np.meshgrid(idx_x, idx_y)

##mask out zero-length vectors:
##mask = ~np.logical_and(quiver_v[0] == 0,quiver_v[1] ==0)
mask = np.logical_or(quiver_v[0] != 0,quiver_v[1] !=0) ## <-- corrected: one operation less

##compute positions and lengths of all non-zero vectors
X = idx_x[mask]
Y = idx_y[mask]
U = quiver_v[0][mask]
V = quiver_v[1][mask]

##plot
fig, ax = plt.subplots()
ax.imshow(test)
ax.quiver(X,Y, U, V, scale_units='xy', angles='xy', scale=0.1, width=0.001, color='red') 

plt.show()

结果如下:

result of the above code

PS:紫色背景的原因是你使用imshow只有一个常数值。您可以通过省略imshow电话来轻松检查。

答案 1 :(得分:0)

在您的quiver函数中添加以下关键字参数:

plt.quiver(quiver_v[0],quiver_v[1], scale_units='xy', angles='xy', scale=0.1, width=0.001, color='red',
    minshaft = 1, minlength=0) # These are the arguments to add

minshaft定义了最小长度,minlength设置了替换小于最小长度的箭头的点的大小