动画"成长" Python / Matplotlib中的线图

时间:2015-01-21 18:41:19

标签: python animation graphics 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)

虽然这有效,但随着它的扩展它会变得很慢。有更快的方法吗?

1 个答案:

答案 0 :(得分:30)

几点说明:

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

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

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)

但是,更好的是,同时更新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)

如果您想使用动画模块(旁注: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()

enter image description here