使用动态网格优化大数据绘图动画

时间:2019-06-30 02:53:27

标签: python matplotlib animation optimization

我正在尝试使用动态网格(海浪)为大型数据生成动画。我设法编写了一个功能正常的脚本,但它很耗时间和资源。我希望有人能看到我可以在代码中进行哪些改进以帮助加快速度。

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib
    from matplotlib import animation as anim
    import xarray as xr
    import PySimpleGUI as sg      
    import sys      

    #file importing mechanism

    jan = xr.open_dataset('Model/Bar_mig/xboutput_equi.nc')

    ########################## labeling the variables in the data-set ##############


    nx = jan.variables['globalx']
    globaltime = jan.variables['globaltime']
    zb = jan.variables['zb'][:,0,:]
    zs = jan.variables['zs'][:,0,:]
    ccz = jan.variables['ccz'][:,:,0,:]
    uz = jan.variables['uz'][:,:,0,:]
    nz = np.array(range(0,100))
    nx = (np.array(range(0,nx.size)))


    globaltime_ar = np.array(globaltime)
    conc = np.vstack(globaltime_ar)
    newdf = pd.DataFrame(conc)
    itr = len(newdf.index)

    uz1=np.flip(uz,0)
    uz2=np.flip(np.flip(uz1,1),axis=0)

    depth1 = (zb)
    a       = np.array(depth1)
    b       = pd.DataFrame(a)
    depth = b.dropna(axis=1, how='all')



    zba1 = (np.array(zb))
    zsa1 = (np.array(-zs))
    zba = pd.DataFrame(zba1)
    zsa = pd.DataFrame(zsa1)

这是我设置动态网格的方式。 (example of the the output

    #dynamic grid
    for w in range(0,itr):
        AA=[]
        sizer = depth.iloc[w,]
        sizer1 = sizer.dropna(axis=0, how='all')
        for j in range(0,sizer1.size):
            maxi = -zsa.iloc[w,j]
            mini = depth.iloc[w,j]
            step = mini/nz.shape[-1]
            globals()['col_{}'.format(j)] = pd.DataFrame(np.linspace(maxi,mini,nz.shape[-1],endpoint=True))
            globals()['col_{}'.format(j)] = globals()['col_{}'.format(j)].reset_index(drop=True)
            AA.append(globals()['col_{}'.format(j)])
        globals()['df_{}'.format(w)] = pd.concat(AA, axis=1).iloc[:nz.size]
        globals()['df_{}'.format(w)].columns = range(globals()['df_{}'.format(w)].shape[1])
        AA.clear()

        sg.OneLineProgressMeter('My meter title', w, itr-1, 'key')

    from matplotlib import animation as anim

    fig = plt.figure(figsize=(15,7.5))                        # Create a dummy figure
    ax = plt.axes()          # Set the axis rigid
    mywriter = anim.FFMpegWriter()
    scale=1
    def animate(w): 
        w = w*scale
        plt.clf()

        plt.title(str(w) + 'hr')
        y = globals()['df_{}'.format(w)]
        x = np.array([nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx,nx])


        data2 = np.flip(ccz[w*1,:,:],0)
        cont = plt.pcolor(x,y,np.array(data2), cmap = 'jet',
                          vmin = 0, vmax = 0.03
                          )
        plt.colorbar(label='Concentration Profile ($m^3/m^3$)')

        plt.fill_between(nx,min(zb[0])-1,zb[w],color = 'yellow')
        point = 350
        plt.xlim(point,nx.shape[-1])
        plt.ylim(min(zb[0,point:point+1]),max(zb[0,point:]))
        plt.xlabel('Cross shore distance (m)')
        plt.ylabel('Depth (m)')
        fig.tight_layout()

        return cont,
    ani = anim.FuncAnimation(fig, animate, interval = 1, frames=itr) 


    ani.save('Sed_Con.mp4', writer=mywriter)

0 个答案:

没有答案