我的箭太频繁,箭袋太小

My arrows are too frequent and too small in quiver

我在网格上创建了​​一个 100x100 单位矢量场,如下所示。我评估了 X 和 Y 网格中每个点组合的一些函数。

import numpy as np
import matplotlib.pyplot as plt
N=100 # of points
#set arrays of n, m and td_50 to try
n_array=np.linspace(0.01,1,N)
td50_array=np.linspace(1,100,N)

X,Y=np.meshgrid(n_array,td50_array)

Z=X*Y

我现在正在尝试绘制 Z 梯度的矢量场,所以我这样做了

#compute gradient,normalized gradient x and y components, as well as gradient raw magnitude
gradx,grady=np.gradient(Z)
gradxnorm=gradx/np.sqrt(gradx**2+grady**2)
gradynorm=grady/np.sqrt(gradx**2+grady**2)
gradmag=np.sqrt(gradx**2+grady**2)
#plot
plt.pcolor(X, Y, gradmag,cmap='rainbow')
plt.colorbar()
plt.quiver(X, Y, gradxnorm , gradynorm,units='xy')
plt.show()

我想绘制梯度幅度与梯度方向(具有统一值)的叠加图

如果我设置 N=10,那么我会得到一个看起来像这样的干净的图。这正是我想要的

但是,我想在每个方向上评估超过 10 个点,但如果我设置 N=100,我会得到这样的图,其中箭头太小且太频繁而无用用渐变覆盖。

我可以看出这只是因为我有更多的点,但是有没有可能让第二个图上的箭头看起来更像第一个图上的箭头?我不需要网格中的每个点都有一个箭头,所以我想要更少的实际更大的箭头,而不是每个像素都有一个小箭头。

当您使用 plt.quiver 时,您可能希望每隔 N 个数据点而不是每个数据点绘制箭头。这需要为您的 XYgradxnormgradynorm 相应地。下面是一个示例,其中我只绘制 x 和 y 坐标为 10 的倍数的点:

import numpy as np
import matplotlib.pyplot as plt
N=100 # of points
#set arrays of n, m and td_50 to try
n_array=np.linspace(0.01,1,N)
td50_array=np.linspace(1,100,N)

X,Y=np.meshgrid(n_array,td50_array)

Z=X*Y

#compute gradient,normalized gradient x and y components, as well as gradient raw magnitude
gradx,grady=np.gradient(Z)
gradxnorm=gradx/np.sqrt(gradx**2+grady**2)
gradynorm=grady/np.sqrt(gradx**2+grady**2)
gradmag=np.sqrt(gradx**2+grady**2)
step=10
plt.pcolor(X, Y, gradmag,cmap='rainbow')
plt.colorbar()

plt.quiver(X[::step,::step], Y[::step,::step],gradxnorm[::step,::step] , gradynorm[::step,::step],units='xy')
plt.show()

输出给出:

您可以修改变量step来增加或减少箭头的数量。