Esempio n. 1
0
def spatiofreq2_season(s,lat,lon,yrs,eventkeys,figno=1,season='coreseason',\
     key='noaa-olr-0-all',flagonly=False,file_suffix='test',savefig=False,\
     fontdict=False):
    '''spatiofreq2_season(s,lat,lon,yrs,figno=1,season='coreseason',\
                          flagonly=False,file_suffix='test')
    Produces subplots of cloud-band gridpoint count by month
    '''
    if not fontdict: fd = {'fontsize': 14, 'fontweight': 'bold'}
    else: fd = fontdict
    mbkl = key.split('-')
    if mbkl[0] == 'noaa': dclim = (1, 9, 1)
    if mbkl[0] == 'hadam3p': dclim = (1, 11, 1)

    if isinstance(season, str):
        if season == 'coreseason': mns = [10, 11, 12, 1, 2, 3]
        elif season == 'fullseason':
            mns = [8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7]
    elif isinstance(season, list):
        mns = season
    m, f = blb.SAfrBasemap(lat[4:-7],lon[3:-2],drawstuff=True,prj='cyl',\
           fno=figno,rsltn='l',fontdict=fd)
    if len(mns) == 12:
        plt.close()
        plt.figure(figsize=[12, 10])
    elif len(mns) == 6:
        plt.close()
        plt.figure(figsize=[13, 8])
    cnt = 1
    msklist = []
    for mn in mns:
        if len(mns) == 12: plt.subplot(4, 3, cnt)
        elif len(mns) == 6: plt.subplot(3, 2, cnt)
        if flagonly:
            allmask=stats.spatiofreq2(m,s,lat,lon,yrs,eventkeys,\
                    clim=(1.,9.,1.),month=mn,flagonly=True,fontdict=fd)
        else:
            allmask=stats.spatiofreq2(m,s,lat,lon,yrs,eventkeys,clim=dclim,\
                                      month=mn,flagonly=False,fontdict=fd)
        if cnt % 2 == 0:
            syp.redrawmap(m,
                          lns=True,
                          resol='verylow',
                          parallel=False,
                          fontdict=fd)
        else:
            syp.redrawmap(m, lns=True, resol='verylow', fontdict=fd)
        cnt += 1
        msklist.append(allmask)
        my.xtickfonts()
        my.ytickfonts()
    plt.subplots_adjust(left=0.05,right=0.92,top=0.97,bottom=0.02,\
                        wspace=0.02,hspace=0.1)
    if savefig:
        if flagonly:
            plt.savefig(stats.figdir + file_suffix + '_flagonly.png', dpi=150)
        else:
            plt.savefig(stats.figdir + file_suffix + '.png', dpi=150)

    return msklist
Esempio n. 2
0
def spatiofreq2(m,s,lat,lon,yrs,eventkeys,meanmask=False,figno=1,\
                clim=(4,36,4),month=False,flagonly=False,fontdict=False):
    '''Get grid-cell frequencies for no. of times a grid-cell falls within a 
       contour describing a feature from metblobs.
    USAGE: If wish to create Basemap within function, m will be "create"
           if wish to have only for particular month, month=yourchoice
           if wish to only count for flagged days, flagonly=True'''
    #plt.close('all')
    if not fontdict: fd = {'fontsize': 14, 'fontweight': 'bold'}
    else: fd = fontdict
    mbskeys = s.mbskeys
    refkey = s.events.values()[0].refkey
    basekey = refkey
    try:
        dset, varstr, levsel, deriv, expid = basekey.split('-')
        descr = dset + '-' + varstr
    except:
        dset, varstr, levsel, deriv = basekey.split('-')
        descr = dset + '-' + varstr
    #vkey='%s-%s-%s-%s' %(dset, varstr, levsel, deriv)
    #x1,x2,y1,y2=blb.blobfilters[sub+'cloudband'][vkey]['ROI']
    #nx, ny = np.abs(x1-x2)/res, np.abs(y1-y2)/res
    #grdsz = (np.int32(nx),np.int32(ny))

    if not eventkeys:
        eventkeys = []
        for ed in s.uniques:
            eventkeys.append(ed[0])
    x, y = np.array(()), np.array(())

    #lon=np.arange(lon[0],lon[-1]+1,0.5)
    #lat=np.arange(lat[0],lat[-1]-1,-0.5)
    allmask = np.zeros((lat.shape[0], lon.shape[0]), dtype=np.float32)

    #Determine which variable we dealing with
    countkey = refkey
    if flagonly: countkey = s.flagkey

    for k in eventkeys:
        e = s.events[k]
        if month:
            mn = month
            mst = e.trkdtimes[0, 1]
            if mst != mn: continue
        if flagonly:
            itrk = e.ixflags
        else:
            trkarr = np.int32(e.trkarrs[countkey])
            if trkarr.ndim == 2:
                ixt = np.where(trkarr[:, 1] > 0)[0]
                uni, iu = np.unique(trkarr[ixt, 0], return_index=True)
                itrk = trkarr[ixt, 1]
                #print len(itrk),":",itrk
            elif trkarr.ndim == 3:
                itrk = np.ndarray((0, ), dtype=np.int32)
                for d in xrange(trkarr.shape[2]):
                    ixt = np.where(trkarr[:, 1, d] > 0)[0]
                    uni, iu = np.unique(trkarr[ixt, 0], return_index=True)
                    ixt = ixt[iu]
                    itrk = np.append(itrk, trkarr[ixt, 1, d].squeeze())
        # Get masks for each contour feature of a track
        for ixtrk in itrk:
            mask = my.poly2mask(lon, lat, e.blobs[countkey]['ch'][ixtrk])
            allmask = allmask + np.float32(mask)

    #cm=plt.cm.PuBu
    #cm=plt.cm.gist_earth_r
    #cm=plt.cm.YlGnBu
    #cm=plt.cm.binary
    #cm=plt.cm.OrRd
    if isinstance(meanmask, np.ndarray):
        cm = plt.cm.RdBu
        #cm=plt.cm.bwr
    else:
        cm = plt.cm.gist_gray_r
    #cm=plt.cm.jet
    #cm=plt.cm.gray_r
    cm.set_under(color='w')
    if m == 'create':
        m, f = blb.SAfrBasemap(lat[3:-6],lon[3:-3],drawstuff=True,\
                               prj='cyl',fno=figno,rsltn='l')
    #df=m.transform_scalar(allmask[::-1,:],lon,lat[::-1],len(lon),len(lat))
    #m.imshow(df,cm,interpolation='nearest')
    #m.pcolor(lon,lat,allmask,cmap=cm)
    #plt.clim(300,1200)
    lon, lat = np.meshgrid(lon, lat)
    #m.contourf(lon,lat,(allmask/len(yrs)),cmap=cm)
    #
    ### Next is dirty trick to drop out permanent mid-latitude cloudiness
    ### allowing colormap to enhance cloud bands better
    allmask[-9:, :] = 0
    std_mask = allmask / len(yrs)
    if isinstance(m, bool):
        return std_mask
    # IF M WAS NOT A BOOLEAN (False) THIS WILL CONTINUE TO PLOTTING
    if isinstance(meanmask, np.ndarray):
        std_mask = std_mask - meanmask
        std_mask = np.where(np.abs(std_mask) < .5, np.nan, std_mask)
        lnmin,lnmx,latmn,latmx =\
                        blb.filters.blobfilters['SAcloudband'][countkey]['ROI']
        latmask = (lat < latmn) & (lat > latmx)  # this is for S. Hemisphere
        meanmasked = np.ma.MaskedArray(meanmask, mask=~latmask)
        cs = m.contour(lon, lat, meanmasked, [1, 2, 3, 4], colors='k')
        labels=plt.clabel(cs, [1,2,3,4],inline_spacing=2, fmt='%d',\
                          fontsize=14)
        #m.contourf(lon,lat,meanmasked,[2,4,14],hatches=['.','..'],\
        #          colors='none',linestyles='-',linewidths='1',alpha=.1)
    ## NEED TO DO THIS SINCE PCOLOR IS NOT SHADING VALUES OUTSIDE OF THE CLIMS
    cstd_mask = np.where(std_mask > clim[1], clim[1], std_mask)
    cstd_mask = np.where(cstd_mask < clim[0], clim[0], cstd_mask)
    # Plot pcolor
    pcolmap = m.pcolormesh(lon, lat, cstd_mask, cmap=cm, zorder=1)
    img = plt.gci()
    for k in eventkeys:
        e = s.events[k]
        if month:
            mn = month
            mst = e.trkdtimes[0, 1]
            if mst != mn: continue
        m.plot(e.trkcX[0], e.trkcY[0], color='w', marker='o', markersize=4)
        if 'COL' in e.mbskeys:
            if len(e.assoctrks['COL']) > 0:
                trar = e.trkarrs['COL']
                for ntrk in xrange(trar.shape[2]):
                    ixx = np.where(trar[:, 1, ntrk] > 0)[0]
                    xx, yy = trar[ixx, 2, ntrk], trar[ixx, 3, ntrk]
                    off = np.random.rand() * .5
                    m.scatter(xx[-1]+off,yy[-1]+off,50,color='none',\
                              edgecolor='k',marker='o',linewidth='2')
                    plt.sci(img)
        #m.plot(e.trkcX,e.trkcY,'0.5')

    plt.clim(clim[0], clim[1])
    bounds = np.arange(clim[0], clim[1] + clim[2], clim[2])
    #vals=np.arange(0,35,2)
    if not month:
        f, ax = plt.gcf(), plt.gca()
        axcol = f.add_axes([0.93, 0.2, 0.02, 0.6])
        plt.colorbar(mappable=img, cax=axcol, boundaries=bounds)
        my.ytickfonts()
        if isinstance(meanmask, np.ndarray):
            plt.ylabel('anomaly grid-point count / year', fontdict=fd)
        else:
            plt.ylabel('grid-point count / year', fontdict=fd)
        plt.axes(ax)
        plt.title('Cloudband Annual Grid-Point Count Climatology: '\
                  +descr.upper(),fontsize='14',fontdict=fd)
        fname = figdir + '/FootprintFreqencygray-' + descr + '.png'
        if flagonly:
            fname = figdir + '/FootprintFreqencygray-' + descr + '_flagonly.png'
        plt.savefig(fname, dpi=150)
    elif month:
        f, ax = plt.gcf(), plt.gca()
        axcol = f.add_axes([0.93, 0.2, 0.02, 0.6])
        plt.colorbar(cax=axcol, boundaries=bounds)
        my.ytickfonts()
        if isinstance(meanmask, np.ndarray):
            plt.ylabel('anomaly grid-point count / year', fontdict=fd)
        else:
            plt.ylabel('grid-point count / year', fontdict=fd)
        plt.axes(ax)
        plt.title(mndict[month], fontweight='demibold')

    return std_mask