Animating “growing” line plot in Python/Matplotlib

前端 未结 1 1687
时光取名叫无心
时光取名叫无心 2020-12-04 14:50

I want to produce a set of frames that can be used to animate a plot of a growing line. In the past, I have always used plt.draw() and set_ydata() to redraw the y-data as it

相关标签:
1条回答
  • 2020-12-04 15:20

    A couple of notes:

    First off, the reason that things become progressively slower is that you're drawing more and more and more overlapping lines in the same position.

    A quick fix is to clear the plot each time:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 10, 100)
    y = np.sin(x)
    
    plt.figure()
    for n in range(len(x)):
        plt.cla()
        plt.plot(x[:n], y[:n], color='k')
        plt.axis([0, 10, 0, 1])
        plt.savefig('Frame%03d.png' %n)
    

    Better yet, however, update both the x and y data at the same time:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 10, 100)
    y = np.sin(x)
    
    fig, ax = plt.subplots()
    line, = ax.plot(x, y, color='k')
    
    for n in range(len(x)):
        line.set_data(x[:n], y[:n])
        ax.axis([0, 10, 0, 1])
        fig.canvas.draw()
        fig.savefig('Frame%03d.png' %n)
    

    And if you'd like to use the animation module (side note: blit=True may not work properly on some backends (e.g. OSX), so try blit=False if you have issues):

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    x = np.linspace(0, 10, 100)
    y = np.sin(x)
    
    fig, ax = plt.subplots()
    line, = ax.plot(x, y, color='k')
    
    def update(num, x, y, line):
        line.set_data(x[:num], y[:num])
        line.axes.axis([0, 10, 0, 1])
        return line,
    
    ani = animation.FuncAnimation(fig, update, len(x), fargs=[x, y, line],
                                  interval=25, blit=True)
    ani.save('test.gif')
    plt.show()
    

    enter image description here

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