假设我有一个代码,例如:
xvalues = range(10000)
yvalues = []
for x in xvalues:
y = do_calculation(x)
yvalues.append(y)
plt.plot(xvalues,yvalues)
此代码生成10,000个不同的图。我想创建一个在每次迭代中更新的单个绘图,以便查看器可以看到绘制图形的动画。
这在python中是否可行?
答案 0 :(得分:3)
根据您的示例,您似乎正在考虑使用简单的for
循环制作动画。是的,您可以使用time.sleep()
执行此操作,以便可以看到动画。关键是使用line.set_data()
和fig.canvas.draw()
更新图表。例如:
import time
import matplotlib.pyplot as plt
import numpy as np
N = 100
do_calculation = np.sin
xsteps = list(range(N))
xvalues = []
yvalues = []
fig = plt.figure()
l, =plt.plot(xvalues, yvalues)
plt.xlim(0, 2 * np.pi)
plt.ylim(-1, 1)
for i in xsteps:
x = i / N * 2 * np.pi
xvalues.append(x)
yvalues.append(do_calculation(x))
l.set_data(xvalues, yvalues)
fig.canvas.draw()
time.sleep(0.01)
plt.show()
您还可以使用animation
模块。这可能会让您更轻松地访问设置以微调动画。您还可以将动画保存为视频。官方的例子是here。以下是我做的一个小例子,它更接近你的例子:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
do_calculation=np.sin
N = 100
xvalues = []
yvalues = []
fig = plt.figure()
l, =plt.plot(xvalues, yvalues)
plt.xlim(0, 2 * np.pi)
plt.ylim(-1, 1)
def update(num, xs, ys, line):
x = num / N * 2 * np.pi
xs.append(x)
ys.append(do_calculation(x))
line.set_data(xs, ys)
if num == N - 1:
xs.clear()
ys.clear()
return line,
line_ani = animation.FuncAnimation(fig, update, N, fargs=(xvalues, yvalues, l), interval=10)
plt.show()