Matplotlib动态绘图中无法刷新plt.axhline()的问题
解决Matplotlib动态图表中axhline无法移除旧线的问题
你的问题出在每次调用plt.axhline(y=ys[-2])时,都是重新创建了一条新的水平线,然后移除这条刚创建的线,而非之前绘制的那条旧线。要解决这个问题,需要保存上一条水平线的引用,在绘制新线前移除旧的。
修正后的代码
import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib import style from random import randrange style.use("fivethirtyeight") fig = plt.figure() ax1 = fig.add_subplot(1,1,1) second = 1 xs = list() ys = list() a = 0 ten = 10 # 保存上一条水平线的引用 prev_hline = None def animate(i): global second, a, ten, prev_hline random_val = randrange(ten) ys.append(random_val) xs.append(second) second += 1 # 优化:不要每次重新plot整个曲线,更新已有线条的数据 if len(ax1.lines) == 0: # 第一次绘制曲线 line, = ax1.plot(xs, ys, linestyle='--', marker='o', color='b') else: # 更新已有曲线的数据 line = ax1.lines[0] line.set_data(xs, ys) # 移除上一条水平线(如果存在) if prev_hline is not None: prev_hline.remove() # 绘制新的水平线并保存引用 prev_hline = ax1.axhline(y=ys[-1], linewidth=2, color='r', linestyle='-') # 控制显示的点数 if len(ys) > 20: ys.pop(0) xs.pop(0) a += 1 ax1.set_xlim(a, 21 + a) ani = animation.FuncAnimation(fig, animate, interval=100) plt.show()
关键改动说明
- 新增
prev_hline全局变量,专门保存上一条水平线的对象引用。 - 每次绘制新水平线前,先检查
prev_hline是否存在,若存在则调用remove()移除旧线。 - 优化曲线绘制逻辑:不再每次重新生成整个曲线,而是更新已有线条的
x、y数据,提升动画性能。 - 简化了数据截断的判断逻辑,合并了
len(ys) > 20和len(xs) > 20的判断(因为两者长度始终一致)。
内容的提问来源于stack exchange,提问作者enis
相关产品推荐
相关产品推荐

