Python/Matplotlib 中的动画 "growing" 线图
Animating "growing" line plot in Python/Matplotlib
我想生成一组可用于为生长线图设置动画的帧。过去,我一直使用 plt.draw() 和 set_ydata() 来重绘随时间变化的 y 数据。这一次,我想画一条 "growing" 线,随着时间在图形上移动。因此,set_ydata 不起作用(扩展数据正在改变长度)。例如,
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)
虽然这可行,但随着它的扩展,它变得非常慢。有更快的方法吗?
一些注意事项:
首先,事情变得越来越慢的原因是你在同一位置绘制越来越多的重叠线。
快速解决方法是每次都清除绘图:
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()
我想生成一组可用于为生长线图设置动画的帧。过去,我一直使用 plt.draw() 和 set_ydata() 来重绘随时间变化的 y 数据。这一次,我想画一条 "growing" 线,随着时间在图形上移动。因此,set_ydata 不起作用(扩展数据正在改变长度)。例如,
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)
虽然这可行,但随着它的扩展,它变得非常慢。有更快的方法吗?
一些注意事项:
首先,事情变得越来越慢的原因是你在同一位置绘制越来越多的重叠线。
快速解决方法是每次都清除绘图:
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()