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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:55:18