在python中,是否可以创建一个图并动态修改它?

时间:2017-06-27 05:20:16

标签: python-3.x matplotlib

假设我有一个代码,例如:

xvalues = range(10000)
yvalues = []
for x in xvalues:
    y = do_calculation(x)
    yvalues.append(y)
    plt.plot(xvalues,yvalues)

此代码生成10,000个不同的图。我想创建一个在每次迭代中更新的单个绘图,以便查看器可以看到绘制图形的动画。

这在python中是否可行?

1 个答案:

答案 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()