我有一张大图,然后这样做:
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()
我得到以下 .
我怎样才能将背景设置为“白色”,或者更确切地说,当值为零时如何避免为箭袋绘制任何东西?
如已删除的答案中所述,您需要过滤掉所有零长度向量。但是,我不计算每个向量的欧几里德长度,而是只检查每个向量分量是否为零,并屏蔽掉所有分量都恰好为零的那些向量。这省去了平方和平方根。然后,您可以使用计算出的掩码来过滤您的 quiver_v
值。但是,此屏蔽过程会返回一维有效值数组,因此为了在正确的位置显示箭袋,您需要为 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
调用轻松检查。
我是一名优秀的程序员,十分优秀!