如何在Matplotlib中绘制箭头长度均匀的Quiver Plot(斜率场)?
如何在Matplotlib中绘制箭头长度均匀的Quiver Plot(斜率场)?
嘿,我看了你的代码和问题,你现在箭头长度参差不齐的原因其实很好解决——你在归一化箭头长度的时候用错了计算对象!
问题出在哪?
你当前代码里的这行:
norm = np.sqrt(X**2 + Y**2)
是用每个点的坐标(x,y)的模长来做归一化因子,而不是用箭头本身的分量(dx, dy)的模长。这就导致离原点越远的箭头被缩得越短,靠近原点的箭头反而更长,最终出现长短不一的情况。
另外还有个小细节:你计算dy的时候用的是一维数组x,但X是meshgrid生成的二维数组,虽然numpy的广播机制能运行,但换成X会更严谨,避免潜在的维度问题。
修正后的代码
下面是调整后的完整代码,能生成箭头长度均匀的斜率场:
import numpy as np import matplotlib.pyplot as plt # 指定网格点 x = np.arange(-3, 3, 0.3) y = np.arange(-2, 4, 0.3) X, Y = np.meshgrid(x, y) # 计算每个点的斜率分量 dy = 0.5 * np.sin(0.5 * np.pi * X) * np.sqrt(Y + 7) dx = np.ones(dy.shape) # 用箭头自身的模长做归一化(这是关键!) norm = np.sqrt(dx**2 + dy**2) # 避免除以0的情况(这里你的场景不会出现,但加个小epsilon更健壮) norm[norm == 0] = 1e-10 dyu = dy / norm dxu = dx / norm # 绘制斜率场 plt.quiver(X, Y, dxu, dyu) plt.show()
为什么这样改?
我们用np.sqrt(dx**2 + dy**2)计算每个箭头自身的长度,再把dx和dy都除以这个长度,就能保证所有箭头都被缩放到单位长度,自然就实现了均匀的箭头效果,和你想要的第一张图一致。
备注:内容来源于stack exchange,提问作者blackened
相关产品推荐
相关产品推荐

