Maintaining one colorbar for maptlotlib FuncAnimation

后端 未结 3 1762
醉酒成梦
醉酒成梦 2020-12-18 10:42

I\'ve made a script which uses matplotlib\'s FuncAnimation function to animate a series of contour plots for paraboloid surface functions. I\'d lik

3条回答
  •  情话喂你
    2020-12-18 11:24

    I guess the idea would be to create a contour plot outside the updating function once and give it a colorbar. The contour plot would then need to have defined levels and the colorrange needs to be defined.

    ax.contourf(..., levels=levels, vmin=zmin, vmax=zmax)
    

    where zmin and zmax are the minimum and maximum data to be shown, and levels is the list or array of levels to use.

    Then, inside the animating function, you would only create a new contour plot with those same parameters without touching the colorbar at all.

    import numpy as np
    import itertools
    import matplotlib.pyplot as plt
    import matplotlib.mlab as ml
    import matplotlib.animation as animation
    
    def f(x,y,a):
        return a*(x**2+y**2)
    
    avals = list(np.linspace(0,1,10))
    xaxis = list(np.linspace(-2,2,9))
    yaxis = list(np.linspace(-2,2,9))
    
    xy = list(itertools.product(xaxis,yaxis))
    xy = np.array(list(map(list,xy)))
    
    x = xy[:,0]
    y = xy[:,1]
    
    zlist = []
    
    for a in avals:
        z = []
        for i, xval in enumerate(x):
            z.append(f(x[i],y[i],a))
        zlist.append(z)
    
    xi = np.linspace(min(x),max(x),len(x))
    yi = np.linspace(min(y), max(y), len(y))
    
    zmin = min([min(zl) for zl in zlist])
    zmax = max([max(zl) for zl in zlist])
    levels = np.linspace(zmin, zmax,41)
    kw = dict(levels=levels, cmap=plt.cm.hsv, vmin=zmin, vmax=zmax, origin='lower')
    
    fig,ax = plt.subplots()
    zi = ml.griddata(x, y, zlist[0], xi, yi, interp='linear')
    contourplot = ax.contourf(xi, yi, zi, **kw)
    cbar = plt.colorbar(contourplot)
    
    def animate(index):
        zi = ml.griddata(x, y, zlist[index], xi, yi, interp='linear')
        ax.clear()
        ax.contourf(xi, yi, zi, **kw)
        ax.set_title('%03d'%(index))
    
    
    ani = animation.FuncAnimation(fig,animate,10,interval=200,blit=False)
    plt.show()
    

提交回复
热议问题