import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani

fig, ax = plt.subplots()

# 横坐标取值
m, n = 100, 20
x = np.linspace(0, 4*np.pi, n)

y = np.zeros((m, n))
for i in range(m):
    y[i] = np.sin(x+2*np.pi*i/m)

# 在画纸上画出零时刻第一条线 ln
ln, = ax.plot(x, y[0], 'ro')

def init():
    """FuncAnimation 所需要的动画初始设置, 返回值为零时刻的线 ln"""
    ax.set_xlim(0, 4*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(i):
    """
    FuncAnimation 所需要的更新函数, 对于第 i 帧, 修改纵轴数据为 y 的第 i 行
    返回值为更新后的第 i 帧对应的线
    """
    ln.set_data(x, y[i])
    return ln,

# 进行绘制. FuncAnimation 的函数文档: https://matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html#matplotlib.animation.FuncAnimation
my_ani = ani.FuncAnimation(fig=fig, func=update, frames=m, interval=1,
                            init_func=init, blit=False)

# Set up formatting for the movie files (3.7.3 报错, 3.8.5 可以)
writer = ani.FFMpegFileWriter(fps=60, metadata=dict(artist='Me'), bitrate=180)
# 保存图片
# my_ani.save('Harmonic.gif',writer=writer)

plt.show()

figalt