【问题标题】:My arrows are too frequent and too small in quiver我的箭太频繁,箭袋太小
【发布时间】:2021-11-10 12:50:14
【问题描述】:

我在网格网格上创建了​​一个 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,我会得到一个像这样的图,而不是箭头太小太频繁,无法用渐变。

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

【问题讨论】:

标签: python matplotlib vector gradient


【解决方案1】:

当您使用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来增加或减少箭头的数量。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多