You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:13:07