2014-09-21 55 views
0

嗨我无法让matplotlib动画起作用 这个想法是在几个列表和图像上生成动画。 a [0]基本上是时间点/图像绘制/ imshow “时间点[a [0] .astype(np.int)] [:i]/60”仅仅是索引的“实时” x轴让matplotlib动画起作用

任何人都可以给我一些提示吗?

赞赏

def draw_plot(resolution,timepoints,a,ts_g,ts_r,contrast): 

    def animate(i): 

     #~ ax.cla() 
     #~ ax2.cla() 
     #~ ax3.cla() 
     #~ ax4.cla() 
     print "ax" 
     ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][0])[:i], yerr=list(a[4][0])[:i], fmt='-o',color='green') 
     ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][1])[:i], yerr=list(a[4][1])[:i], fmt='-o',color='red') 
     ax.axis([0,timepoints[a[0].astype(np.int)][-1]/60,np.min(np.concatenate((a[1][0],a[1][1])))*0.75,np.max(np.concatenate((a[1][0],a[1][1])))*1.3]) 
     ax.set_autoscale_on(False) 
     print "ax2" 
     ax2.plot(timepoints[a[0].astype(np.int)][:i]/60,list(a[2][0])[:i],color='green') 
     ax2.plot(timepoints[a[0].astype(np.int)][:i]/60,list(a[2][1])[:i],color='red') 
     ax2.axis([0,timepoints[a[0].astype(np.int)][-1]/60,np.min(np.concatenate((a[2][0],a[2][1])))*0.75,np.max(np.concatenate((a[2][0],a[2][1])))*1.3]) 
     ax2.set_autoscale_on(False) 

     j = int(a[0][i]-1) 
     r = ts_r[j]#.T 
     g = ts_g[j]#.T 

     max_ = contrast[3] 
     min_ = contrast[2] #~ 
     r[r>max_]=max_ 
     r[r<min_]=min_ 
     r -= min_ 
     r *= _16bit/(max_-min_)#r.max() 

     max_ = contrast[1] 
     min_ = contrast[0] 
     g[g>max_]=max_ 
     g[g<min_]=min_ 
     g -= min_ 
     g *= _16bit/(max_-min_)#r.max() 
     #~ 
     g_16 = g 

     r = (r*ratio).astype(np.uint8) 
     g = (g*ratio).astype(np.uint8) 
     b = np.zeros(r.shape).astype(np.uint8) 
     centered = np.dstack((r,g,b)).astype(np.uint8) 

     #~ aa = np.dstack((np.zeros(ts[0].shape).T,ts[j].T,np.zeros(ts[0].shape))) 
     print "ax3" 
     ax3.imshow(centered) 
     ax3.plot(list(a[5][0]/resolution)[:i],list(512-a[5][1]/resolution)[:i],color='blue') 
     ax3.axis([0,512,512,0]) 

     print "ax4" 
     ax4.imshow(centered) 
     x = int (list(a[5][0]/resolution)[i]) 
     y = int (list(512-a[5][1]/resolution)[i]) 
     #~ ax4.axis([512,0,512,0]) 
     ax4.axis([x-10,x+10,y-10,y+10]) 
     ax4.get_xaxis().set_visible(False) 
     ax4.get_yaxis().set_visible(False) 
     print "ax5" 
     ax5.imshow(g_16,cmap='gray') 
     #~ x = int (list(a[5][0]/resolution)[i]) 
     #~ y = int (list(512-a[5][1]/resolution)[i]) 
     #~ ax4.axis([512,0,512,0]) 
     ax5.axis([x-10,x+10,y-10,y+10]) 
     ax5.get_xaxis().set_visible(False) 
     ax5.get_yaxis().set_visible(False) 
     plt.draw() 


    fig = plt.figure() 


    ax = plt.subplot2grid((2,5), (0,0),colspan=2) 
    ax2 = plt.subplot2grid((2,5), (1,0),colspan=2) 
    ax3 = plt.subplot2grid((2,5), (0, 2), colspan=2,rowspan=2) 
    ax4 = plt.subplot2grid((2,5), (0,4)) 
    ax5 = plt.subplot2grid((2,5), (1, 4)) 
    line, = ax.plot([], [], lw=2) 
    line2, = ax2.plot([], [], lw=2) 

    ani = animation.FuncAnimation(fig, animate, frames= len(a[0]), interval=20000,repeat=False,blit=True) 
    plt.show() 
+0

如果您花时间简化一点代码,提供代表模型的最短可执行代码,这将帮助我们检查它。 – joaquin 2014-09-21 11:11:38

+0

你应该从这里开始:http://matplotlib.org/examples/animation/simple_anim.html你需要一个init函数。另外,一般来说,我不认为你应该每次都在绘制动画功能;你应该调用该图的set_data方法并简单地改变数据。否则它会很慢(我甚至不知道它是否会起作用)。 – 2014-09-22 08:37:14

+0

我修好了。我小到大。唯一不能正确的是ax.errorbar的垂直条。我用lineerr(底部,顶部),vers = ax.errorbar(etcetcetcetc)来称呼它。我能够lineerr.setdata(list1,list2)bottoms.setdata(list1,list2)但我无法显示竖线。 :( – 2014-09-22 21:07:19

回答

0

好吧,这样它的工作原理。

然而:

1-我不能返回与多个轴/行(行= [])我必须单独返回每一个(errorline_g等,等)。它可以用于正常的斧列表.plot,所以我不知道为什么errorbars不能做同样的事情。 与垂直条相同。我不得不使用errorline_g,(bottomomsg,topsg),(vertsg,)= ax.errorbar([],[],yerr = 1,fmt =' - o',color ='green') 如果我不如果我尝试返回vertsg或vertsg [0]它不起作用,请在声明中解开元组。

def draw_plot(resolution,timepoints,a,ts_g,ts_r,contrast,csvfile): 
    fig = plt.figure() 
    ax = plt.subplot2grid((2,5), (0,0),colspan=2) 
    ax2 = plt.subplot2grid((2,5), (1,0),colspan=2) 
    ax3 = plt.subplot2grid((2,5), (0, 2), colspan=2,rowspan=2) 
    ax4 = plt.subplot2grid((2,5), (0,4)) 
    ax5 = plt.subplot2grid((2,5), (1, 4)) 

    ax.axis([0,(timepoints[a[0].astype(np.int)-1][-1]/60)+5,np.min(np.concatenate((a[1][0],a[1][1])))*0.75,np.max(np.concatenate((a[1][0],a[1][1])))*1.3]) 
    ax.set_autoscale_on(False) 

    ax2.axis([0,(timepoints[a[0].astype(np.int)-1][-1]/60)+5,np.min(np.concatenate((a[2][0],a[2][1])))*0.75,np.max(np.concatenate((a[2][0],a[2][1])))*1.3]) 
    ax2.set_autoscale_on(False) 

    #~ ax3.axis([0,512,512,0]) 
    ax3.get_yaxis().set_visible(False) 

    ax4.get_xaxis().set_visible(False) 
    ax4.get_yaxis().set_visible(False) 

    ax5.get_xaxis().set_visible(False) 
    ax5.get_yaxis().set_visible(False) 

    errorline_g, (bottomsg,topsg), (vertsg,)= ax.errorbar([],[],yerr=1,fmt='-o',color='green') 
    errorline_r, (bottomsr,topsr), (vertsr,) = ax.errorbar([],[],yerr=1,fmt='-o',color='red') 


    lines = [] 
    lines += ax2.plot([],[], color='green', lw=2) 
    lines += ax2.plot([],[], color='red', lw=2) 


    lines += ax3.plot([],[],color='blue') 


    def animate(i=0): 

     #~ ax.cla() 
     #~ ax2.cla() 
     #~ ax3.cla() 
     #~ ax4.cla() 
     x = timepoints[a[0].astype(np.int)][:i+1]/60 
     y = list(a[1][0])[:i+1] 
     g_berr = np.array(a[1][0])[:i+1]+np.array(a[4][0])[:i+1] 
     g_terr = np.array(a[1][0])[:i+1]-np.array(a[4][0])[:i+1] 
     r_berr =np.array(a[1][1])[:i+1]+np.array(a[4][1])[:i+1] 
     r_terr =np.array(a[1][1])[:i+1]-np.array(a[4][1])[:i+1] 
     errorline_g.set_data(x,y) 
     bottomsg.set_data(x,g_berr) 
     topsg.set_data(x,g_terr) 
     vertsg.set_segments(zip(zip(x,g_terr),zip(x,g_berr))) 

     #~ ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][1])[:i], yerr=list(a[4][1])[:i], fmt='-o',color='red') 
     ax.fill_between(x, g_berr, g_terr, 
    alpha=0.05, edgecolor='green', facecolor='green') 
     #~ print errorline_g 
     y = list(a[1][1])[:i+1] 
     errorline_r.set_data(x,y) 
     bottomsr.set_data(x,r_berr) 
     topsr.set_data(x,r_terr) 
     ax.fill_between(x, r_berr, r_terr, 
    alpha=0.08, edgecolor='red', facecolor='red') 
     vertsr.set_segments(zip(zip(x,r_terr),zip(x,r_berr))) 
     lines[0].set_data(timepoints[a[0].astype(np.int)][:i+1]/60,list(a[2][0])[:i+1]) 
     lines[1].set_data(timepoints[a[0].astype(np.int)][:i+1]/60,list(a[2][1])[:i+1]) 


     j = int(a[0][i]-1) 
     r = ts_r[j]#.T 
     g = ts_g[j]#.T 

     max_ = contrast[3] 
     min_ = contrast[2] #~ 
     r[r>max_]=max_ 
     r[r<min_]=min_ 
     r -= min_ 
     r *= _16bit/(max_-min_)#r.max() 

     max_ = contrast[1] 
     min_ = contrast[0] 
     g[g>max_]=max_ 
     g[g<min_]=min_ 
     g -= min_ 
     g *= _16bit/(max_-min_)#r.max() 

     g_16 = g 

     r = (r*ratio).astype(np.uint8) 
     g = (g*ratio).astype(np.uint8) 
     b = np.zeros(r.shape).astype(np.uint8) 
     centered = np.dstack((r,g,b)).astype(np.uint8) 

     ax3.imshow(centered) 
     lines[2].set_data(list(a[5][0]/resolution)[:i],list(512-a[5][1]/resolution)[:i]) 
     #~ ax3.axis([0,512,512,0]) 

     ax4.imshow(centered) 
     x = int (list(a[5][0]/resolution)[i]) 
     y = int (list(512-a[5][1]/resolution)[i]) 
     #~# 
     ax4.axis([x-10,x+10,y-10,y+10]) 


     ax5.imshow(g_16,cmap='gray') 

     ax5.axis([x-10,x+10,y-10,y+10]) 

     #~ plt.draw() 
     return errorline_g, errorline_r, lines[0], lines[1],lines[2],bottomsg,topsg,bottomsr,topsr,ax,ax2,ax3,ax4,ax5,vertsg 

    def init(): 
     errorline_g.set_data([],[]) 
     errorline_r.set_data([],[]) 
     for line in lines: 
      line.set_data([],[]) 
     #~ lines[0].set_data([],[]) 
     #~ lines[1].set_data([],[]) 

     ax3.imshow(np.zeros(ts_r[0].shape)) 
     ax4.imshow(np.zeros(ts_r[0].shape)) 
     ax5.imshow(np.zeros(ts_r[0].shape)) 
     return errorline_g, errorline_r, lines[0], lines[1], lines[2],ax,ax2,ax3,ax4,ax5 



    ani = animation.FuncAnimation(fig, animate, init_func=init, frames= len(a[0]), interval=500,repeat=False,blit=True) 
    plt.show() 
    #~ ani.save('./mp4/'+csvfile.strip('.csv').strip('./')+".mp4") 


    plt.close()