Updating the x-axis values using matplotlib animation

后端 未结 3 1544
执念已碎
执念已碎 2020-12-09 12:14

I am trying to use matplotlib.ArtistAnimation to animate two subplots. I want the x-axis to increase in value as the animation progresses, such that the total l

相关标签:
3条回答
  • 2020-12-09 12:51

    If you are using blitting, you can call pyplot.draw() to redraw the entire figure, each time you change y/x axis.

    This updates whole figure, so is relatively slow, but it's acceptable if you don't call it many items.

    0 讨论(0)
  • 2020-12-09 12:57

    This moves your axis, but is very slow.

    import matplotlib.pylab as plt
    import matplotlib.animation as anim
    import numpy as np
    
    
    image = np.random.rand(100,10,10)
    repeat_length = (np.shape(image)[0]+1)/4
    
    fig = plt.figure()
    ax1 = ax1=fig.add_subplot(1,2,1)
    im = ax1.imshow(image[0,:,:])
    
    ax2 = plt.subplot(122)
    ax2.set_xlim([0,repeat_length])
    ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])
    im2, = ax2.plot(image[0:0,5,5],color=(0,0,1))
    
    canvas = ax2.figure.canvas
    
    def init():
        im = ax1.imshow(image[0,:,:])
        im2.set_data([], [])
        return im,im2,
    
    def animate(time):
        time = time%len(image)
        im = ax1.imshow(image[time,:,:])
        im2, = ax2.plot(image[0:time,5,5],color=(0,0,1))
        if time>repeat_length:
            print time
            im2.axes.set_xlim(time-repeat_length,time)
            plt.draw()
        return im,im2,
    
    ax2.get_yaxis().set_animated(True)
    
    # call the animator.  blit=True means only re-draw the parts that have changed.
    animate = anim.FuncAnimation(fig, animate, init_func=init,
                                   interval=0, blit=True, repeat=True)
    
    plt.show()
    
    0 讨论(0)
  • 2020-12-09 13:08

    If you don't need blitting

    import matplotlib.pylab as plt
    import matplotlib.animation as animation
    import numpy as np
    
    #create image with format (time,x,y)
    image = np.random.rand(100,10,10)
    
    #setup figure
    fig = plt.figure()
    ax1 = fig.add_subplot(1,2,1)
    ax2 = fig.add_subplot(1,2,2)
    #set up viewing window (in this case the 25 most recent values)
    repeat_length = (np.shape(image)[0]+1)/4
    ax2.set_xlim([0,repeat_length])
    #ax2.autoscale_view()
    ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])
    
    #set up list of images for animation
    
    
    im = ax1.imshow(image[0,:,:])
    im2, = ax2.plot([], [], color=(0,0,1))
    
    def func(n):
        im.set_data(image[n,:,:])
    
        im2.set_xdata(np.arange(n))
        im2.set_ydata(image[0:n, 5, 5])
        if n>repeat_length:
            lim = ax2.set_xlim(n-repeat_length, n)
        else:
            # makes it look ok when the animation loops
            lim = ax2.set_xlim(0, repeat_length)
        return im, im2
    
    ani = animation.FuncAnimation(fig, func, frames=image.shape[0], interval=30, blit=False)
    
    plt.show()
    

    will work.

    If you need to run faster, you will need to play games with the bounding box used for blitting so that the axes labels are updated.

    0 讨论(0)
提交回复
热议问题