2015-10-18 62 views
4

我想通过动画在for循环中绘制一些数据。我希望它等到动画完成,然后继续进行for循环。暂停似乎工作,让这个,但有时电影很长,我想关闭,并转移到下一个。有人知道我能做到吗?for循环中的Matplotlib动画?

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import time 

for j in range(0,2): 
fig = plt.figure(j) 
mngr = plt.get_current_fig_manager() 
mngr.window.setGeometry(j*256,0,256, 256) 

ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 
line, = ax.plot([], [], lw=2) 

# initialization function: plot the background of each frame 
def init(): 
    line.set_data([], []) 
    return line, 

# animation function. This is called sequentially 
def animate(i): 
    x = np.linspace(0, 2, 1000) 
    y = np.sin(2 * np.pi * (x - 0.01 * i+j/4.)) 
    line.set_data(x, y) 
    return line, 

# call the animator. blit=True means only re-draw the parts that have changed. 
anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=200, interval=20, blit=True,repeat=False) 

plt.pause(0.02*200) 

plt.show(block=True) 
+0

在'plt.pause(0.02 * 200)'后面加上'plt.close()'' –

回答

0

一种方法是使用KeyboardInterrupt异常移动到下一个图。 为了更好的可读性,将您绘制成一个函数:现在

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import time 



def animate_multi(j): 
    fig = plt.figure(j) 
    mngr = plt.get_current_fig_manager() 
    mngr.window.setGeometry(j*256,0,256, 256) 

    ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 
    line, = ax.plot([], [], lw=2) 

    # initialization function: plot the background of each frame 
    def init(): 
     line.set_data([], []) 
     return line, 

    # animation function. This is called sequentially 
    def animate(i): 
     x = np.linspace(0, 2, 1000) 
     y = np.sin(2 * np.pi * (x - 0.01 * i+j/4.)) 
     line.set_data(x, y) 
     return line, 

    # call the animator. blit=True means only re-draw the parts that have changed. 
    anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=200, interval=20, blit=True,repeat=False) 

    plt.pause(0.02*200) 
    plt.close() 
    plt.show(block=True) 

,在循环除了KeyboardInterrup,并继续到下一个动画:

for j in range(5): 
    try: 
     print('Working on plot', j) 
     animate_multi(j) 
    except KeyboardInterrupt: 
     plt.close() 

注:您可能必须按<Ctrl>-<C>两次跳到下一个动画。

+0

这是否适合您? –