解决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
相关产品推荐
相关产品推荐

