Matplotlib动画图如何仅动态展示最新数据点的数值标注
问题解决代码
import numpy as np from matplotlib.animation import FuncAnimation from matplotlib import pyplot as plt def collatz(k): seq = [k] while seq[-1] > 1: if k % 2 == 0: seq.append(k/2) else: seq.append(3*k+1) k = seq[-1] return seq y= collatz(22) x = list(range(len(y))) fig = plt.figure() plt.xlim(0, len(y)-1) plt.ylim(1,max(y)) draw, = plt.plot([],[], marker='o', markersize='4', color='magenta') # 存储上一帧的标注对象 last_ann = None def update(idx): global last_ann draw.set_data(x[:idx+1], y[:idx+1]) # 先删除上一帧的旧标注 if last_ann is not None: last_ann.remove() # 生成当前帧的新标注 ann = plt.annotate(f'{y[idx]:.1f}', (x[idx],y[idx]), textcoords="offset points", xytext=(0,5), ha="center") last_ann = ann return draw, ann a = FuncAnimation(fig, update, frames=len(x), interval=500, repeat=False) plt.show()
核心修改说明
- 新增全局变量
last_ann存储上一帧的标注,每次更新帧时先删除旧标注,避免历史标注堆积 - 修正了原代码
set_data(x[:idx], y[:idx])的切片问题:Python切片左闭右开,原写法会漏掉当前索引对应的点,导致看起来标注比点先渲染 - 移除
plt.pause调用,直接通过FuncAnimation的interval参数控制帧间隔,不会打乱内部渲染调度 - 调整标注偏移量、x轴范围,避免显示截断、标注和点重叠的问题
- 返回值新增标注对象,保证渲染时的时序正确
内容的提问来源于stack exchange,提问作者Maggie
相关产品推荐
相关产品推荐

