删除Line2D对象后Matplotlib figure不更新问题求解
问题原因
你直接对ax.lines执行pop(0)操作不符合Matplotlib的API设计规范,是操作不生效的核心原因:
ax.lines是Axes对象对外暴露的、分类存储Line2D线条对象的视图列表,并不是Axes内部实际管理渲染元素的核心容器。直接从ax.lines中pop元素,仅会删除该列表对线条对象的引用,不会触发线条从Axes渲染队列的注销逻辑,线条对象依然存在于Axes的子元素存储队列中,因此重绘画布时线条依然会被渲染。- 手动调用的
fig.canvas.draw()仅会遍历当前Axes注册的所有可见子元素执行重绘,不会同步ax.lines的手动修改结果。
修复方案
Matplotlib公开了专用的remove()方法用于删除已绘制的Artist元素,修改后的代码可按两种写法实现需求:
写法1:保留线条引用直接删除
import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(1, 1, 1) # 绘制时存储线条对象的引用 line, = ax.plot([0.5, 0.7], [0.5, 0.8]) plt.pause(2) # 调用remove方法删除线条,会自动从Axes的所有队列中移除该元素 line.remove() fig.canvas.draw() fig.canvas.flush_events() plt.pause(2)
写法2:按索引删除线条
如果不需要提前保留线条引用,也可以直接通过索引调用对应线条的remove方法:
# 替换原来的ax.lines.pop(0)即可 ax.lines[0].remove()
内容的提问来源于stack exchange,提问作者Andreas Schwaiger
相关产品推荐
相关产品推荐

