这是我的向量场图:
我希望速度场的向量在整个图中均匀分布,而不是在 x 方向上挤压在一起,并在 y 方向上拉伸(stretch)。
我想我知道为什么会出错,但是如何让它正常运行呢? 这是代码的相关部分。
slice_interval = 10
skip = slice(None, None, slice_interval)
plt.quiver(x[skip], y[skip], u[skip], v[skip])
更新
根据建议的解决方案,执行x[skip][skip]
等...并没有解决问题。如果说有什么不同的话,那就是它实际上让情况变得更糟。但它可能提供一些修补的可能性,也许每个轴有不同的跳跃?我会尝试自己修改一些。
尝试建议的解决方案后的新图表:
新更新
我第一次没有正确实现该解决方案,经过大量摆弄,我现在得到了一个漂亮的速度场图,非常感谢您的帮助和鼓励,特别是 xg.plt.py 的解决方案。
更正情节:
最佳答案
如果您希望它们在 x 轴和 y 轴上均匀分布,则必须在两个维度上对输入数组进行切片。否则,您将按行进行切片。
唯一需要更改的行是:
plt.quiver(x[skip,skip], y[skip,skip], u[skip,skip], v[skip,skip])
编辑
正如评论中所指出的,另一种选择是定义 skip2 = (slice(None, None, slice_interval),) * 2
并直接使用 array[skip2]
对数组进行切片给出完全相同的结果。
另一个案例是array[skip][skip]
。在这种情况下,应用切片,然后再次对第一个切片的结果进行切片,第二个 [skip]
不应用于数组的第二个轴,而是应用于 array[skip]
的第一个轴。它正在一步一步地做:
# we start from array.shape = (110, 100)
a2 = array[skip]
# Intermediate step: a2.shape = (11, 100) # containing rows 0, 10, 20...
a3 = a2[skip]
# Final output: a3.shape = (2,100) # now we have sliced every 10 rows of a2
# which translated to array means slicing every 100 rows and still keeping all the columns.
下面有一个图显示了每个有趣的情况(u 和 v 都设置为 1,以便所有向量都相等,并且网格是使用 0 到 100 之间的 100 点 linspace 创建的,x 和 110 点之间y 中的 -50 和 50)
关于python - 图中轴矢量场的缩放颤动图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49992507/