在Python/Matplotlib中动画"增长"线图

Bli*_*ink 19 python graphics animation matplotlib

我想制作一组可用于为不断增长的线条绘制动画的帧.在过去,我总是使用plt.draw()和set_ydata()来重绘y数据,因为它随着时间的推移而变化.这一次,我希望绘制一条"增长"的线,随着时间的推移在图形中移动.因此,set_ydata不起作用(xdata正在改变长度).例如,

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
for n in range(len(x)):
    plt.plot(x[:n], y[:n], color='k')
    plt.axis([0, 10, 0, 1])
    plt.savefig('Frame%03d.png' %n)
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但随着它的扩展它变得非常慢.有更快的方法吗?

Joe*_*ton 32

几个笔记:

首先,事情逐渐变慢的原因是你在相同的位置绘制越来越多的重叠线.

快速解决方法是每次清除绘图:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
for n in range(len(x)):
    plt.cla()
    plt.plot(x[:n], y[:n], color='k')
    plt.axis([0, 10, 0, 1])
    plt.savefig('Frame%03d.png' %n)
Run Code Online (Sandbox Code Playgroud)

但是,更好的是,同时更新x和y数据:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots()
line, = ax.plot(x, y, color='k')

for n in range(len(x)):
    line.set_data(x[:n], y[:n])
    ax.axis([0, 10, 0, 1])
    fig.canvas.draw()
    fig.savefig('Frame%03d.png' %n)
Run Code Online (Sandbox Code Playgroud)

如果您想使用动画模块(旁注:blit=True可能无法在某些后端(例如OSX)上正常工作,请尝试blit=False如果您遇到问题):

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

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots()
line, = ax.plot(x, y, color='k')

def update(num, x, y, line):
    line.set_data(x[:num], y[:num])
    line.axes.axis([0, 10, 0, 1])
    return line,

ani = animation.FuncAnimation(fig, update, len(x), fargs=[x, y, line],
                              interval=25, blit=True)
ani.save('test.gif')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @JoeKington - 这可能是一个愚蠢的问题,但我可以问你的“num”参数来自哪里吗?(`def update(num, x, y, line)`)。我没有看到它列在 `fargs=[x, y, line]` 中。谢谢! (3认同)
  • `set_data` 解决方案非常优雅。希望我能投票10次。 (2认同)