pythonmatplotlibplot

How to change color of plotted curves when using Animations in Python MatPlotLib?


I have a piece of code that uses the FuncAnimation method in Python MatPlotLib to generate 50 random Exponential Decay Curves and updating the plot showing each one other the curves as they re generated.Each curves shows up with different colors. I would like to be able to gray out the previos curves as the new one is generated in a set color, say Blue. I hope someone can help.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random 

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)       
def main(i):
    # Actual parameters
    A0 = 10 
    K0 = random.uniform(-15,-1)
    C0 = random.uniform(0,10)      

    # Generate some data based on these
    tmin, tmax = 0, 0.5
    num = 20
    t = np.linspace(tmin, tmax, num)
    y = model_func(t, A0, K0, C0)
    ax1.plot(t,y)
def model_func(t, A, K, C):   
        return A * np.exp(K * t)

ani = animation.FuncAnimation(fig, main, interval=1000)

plt.show()

Solution

  • you have to store the line instance which plot returns and call set_color(color) before you draw again:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    import random 
    
    # an empty variable, whre we store the returned line of plot:
    line = None
    
    fig = plt.figure()
    ax1 = fig.add_subplot(1,1,1)       
    def main(i):
        
        # we have to make line global:
        global line
    
        # Actual parameters
        A0 = 10 
        K0 = random.uniform(-15,-1)
        C0 = random.uniform(0,10)      
    
        # Generate some data based on these
        tmin, tmax = 0, 0.5
        num = 20
        t = np.linspace(tmin, tmax, num)
        y = model_func(t, A0, K0, C0)
        # check if line already exists, if yes make it gray:
        if line is not None:
            line.set_color('gray')
        # plot returns a list with line instances, one for each line you draw,
        # the comma is used to unpack the one element list
        line, = ax1.plot(t,y, color='red') 
    
    def model_func(t, A, K, C):   
            return A * np.exp(K * t)
    
    # ani = animation.FuncAnimation(fig, main, interval=1000) ## will throw an USER WARMING
    # ani = animation.FuncAnimation(fig, main, interval=1000, save_count=100) # save_count=MAXFRAMES  --> OK 
    
    ani = animation.FuncAnimation(fig, main, interval=1000, cache_frame_data=False)  # --> OK
    plt.show()
    

    plot result