我有一张大图像并且做这样的事情:
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()
如何将背景设置为“白色”,或者当值为零时如何避免为箭袋绘制任何内容?
答案 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()
结果如下:
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
设置了替换小于最小长度的箭头的点的大小