让matplotlib动画工作

时间:2014-09-21 11:02:27

标签: python matplotlib

您好我在使用matplotlib动画时遇到了麻烦 这个想法是在几个列表和图像中制作动画。 a [0]基本上是时间点/图像来绘制/ imshow "时间点[A [0] .astype(np.int)] [:I] / 60"只是索引的"实时"在x轴

愿任何人给我一些提示吗?

赞赏

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

1 个答案:

答案 0 :(得分:0)

好吧,就像这样有效。

然而:

1-我无法使用多个轴/行返回列表(lines = [])我必须单独返回每个(errorline_g等等)。它可以使用普通的ax.plots,所以我不知道为什么错误栏也不能这样做。 与垂直条相同。我不得不使用errorline_g,(bottomsg,topsg),(vertsg,)= ax.errorbar([],[],yerr = 1,fmt =&#39; -o&#39;,color =&#39; green& #39) 如果我试图返回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()