Matplotlib:逐步动画功能输出

时间:2017-10-07 15:50:35

标签: animation matplotlib jupyter

我有一个输出return (x, y)的函数,我想从头到尾为x,y对设置动画。例如。这条线“随着时间的推移而发展”。

这就是我的输出:

x, y = stephan()
plt.plot(x,y)

enter image description here

当我尝试使用动画代码的snippit时:

fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))

line, = ax.plot([], [])

def init():
    line.set_data([], [])
    return line,

def animate(i):
    x, y = stephan()
    line.set_data(x, y[i])
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True)

我得到了这个非常无聊的输出:

enter image description here

它正在绘制一些东西,但肯定不是x,y输出。我认为我可能错误地使用了animate或init函数?奇怪的是,我还没有找到任何简单的代码。

1 个答案:

答案 0 :(得分:0)

如果对stephan的调用返回两个浮点数,y[i]没有任何意义。此外,您希望将输出存储在列表中,以获得一行而不是每帧一个点。

一个工作示例可能看起来像这样

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

class Stephan():
    i=0
    def __call__(self):
        self.i += 0.02
        return self.i, np.random.randn(1)

stephan = Stephan()

fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))

line, = ax.plot([], [])

def init():
    line.set_data([], [])
    return line,

X = []
def animate(i):
    x, y = stephan()
    X.append((x,y))
    line.set_data(zip(*X))
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True)

plt.show()

或者,如果stephan返回两个值列表,您可以直接将这些列表设置为该行的数据。

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

class Stephan():
    x=[0]
    y=[1]
    def __call__(self):
        self.x.append(self.x[-1]+0.02)
        self.y.append(np.random.randn(1))
        return self.x, self.y

stephan = Stephan()

fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))

line, = ax.plot([], [])

def init():
    line.set_data([], [])
    return line,

def animate(i):
    x, y = stephan()
    line.set_data(x,y)
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True)

plt.show()