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

解决Jupyter中matplotlib.pyplot.quiver重复调用箭头堆叠问题

解决Matplotlib Quiver箭头堆积问题

问题原因

每次调用plt.quiver()都会在当前轴上添加新的箭头元素,不会自动清除旧的;而plt.imshow()默认会替换轴上已有的图像层,所以颜色能正常更新,但箭头会叠加堆积。

解决方案

方案1:每次绘制前清除当前轴

在调用绘图函数前,使用plt.cla()清除当前轴的所有元素(包括箭头和图像),再重新绘制:

# 第一次绘制
plot_map(arr_1)
plot_arrows(arr_1)
plt.show(block=False)

# 第二次绘制前清除轴
plt.cla()
plot_map(arr_2)
plot_arrows(arr_2)
plt.draw()

如果需要保留轴的刻度、标签等设置,plt.gca().clear()和plt.cla()效果一致。

方案2:保存Quiver对象并手动移除

修改plot_arrows函数,让它返回创建的Quiver对象,下次绘制前调用remove()方法清除旧箭头:

def plot_arrows(arr_2D):
    X = np.arange(2)
    Y = np.arange(2)
    U = np.cos(arr_2D[X][Y])
    V = np.sin(arr_2D[X][Y])
    q = plt.quiver(X,Y,U,V, units='x', headaxislength=2, headlength=1, pivot='mid', scale=1.1)
    return q

# 第一次调用
q = plot_arrows(arr_1)
# 第二次调用前移除旧箭头
q.remove()
q = plot_arrows(arr_2)

这种方式只会清除箭头,不会影响已绘制的图像层。

方案3:复用Quiver对象更新数据

如果需要频繁更新箭头,最高效的方式是只创建一次Quiver对象,之后通过set_UVC()方法更新箭头的方向数据:

# 初始化Quiver对象(仅执行一次)
X = np.arange(2)
Y = np.arange(2)
q = plt.quiver(X, Y, [], [], units='x', headaxislength=2, headlength=1, pivot='mid', scale=1.1)

# 定义更新箭头的函数
def update_arrows(arr_2D):
    U = np.cos(arr_2D[X][Y])
    V = np.sin(arr_2D[X][Y])
    q.set_UVC(U, V)  # 更新箭头的U、V分量
    plt.draw()       # 刷新绘图

# 第一次更新
update_arrows(arr_1)
# 第二次更新
update_arrows(arr_2)

这种方式避免了反复创建和删除绘图对象,性能更优。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:33:33