Changeset 785 in lmdz_wrf


Ignore:
Timestamp:
May 28, 2016, 5:07:13 PM (9 years ago)
Author:
lfita
Message:

Adding `plot_river_pattern' to plot a given river and its subbasins with the stations using:

  • routing.nc: discharge grid tracjectories
  • river_desc.nc: river subbasins and description
  • GRDC_Monthly_June14.nc: stations location
Location:
trunk/tools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/drawing.py

    r782 r785  
    33333333
    33343334def draw_basins(ncfile, values, varns):
    3335     """ Function to plot wind basins
     3335    """ Function to plot river basins with their discharge vector and basins id (from 'routing.nc')
    33363336      values= [lonlatbox]:[mapres]:[cbarname]:[xtrmbasin]:[mapdraw]:[veclength]:[freq]:
    33373337        [ifreq]:[plotcountry]:[basinidn]:[gtit]:[kindfig]:[figuren]
  • trunk/tools/drawing_tools.py

    r782 r785  
    1111from netCDF4 import Dataset as NetCDFFile
    1212import nc_var_tools as ncvar
     13import generic_tools as gen
    1314
    1415errormsg = 'ERROR -- error -- ERROR -- error'
     
    63976398    return
    63986399
     6400def plot_river_pattern(xvals, yvals, fvals, veccolor, descid, desclon, desclat,      \
     6401  stn, stlon, stlat, drawcountry, drawbasinid, colordescid, coloriver, colornoriver, \
     6402  colorst, graphtit, mapv, kfig, figname):
     6403    """ Function to plot vectors
     6404      xvals= values for the x-axis
     6405      yvals= values for the y-axis
     6406      fvals= values for the flow (1-8: N, NE, E, ..., NW; 97: sub-basin; 98: small to sea; 99: large to sea)
     6407      veccolor= basin id
     6408      descid= description id
     6409, desclon, desclat,
     6410      mapv= map characteristics: [proj],[res]
     6411        see full documentation: http://matplotlib.org/basemap/
     6412        [proj]: projection
     6413          * 'cyl', cilindric
     6414          * 'lcc', lambert conformal
     6415        [res]: resolution:
     6416          * 'c', crude
     6417          * 'l', low
     6418          * 'i', intermediate
     6419          * 'h', high
     6420          * 'f', full
     6421      drawcountry= whether country lines should be plotted or not
     6422      drawbasinid= whether basins id should be plotted or not
     6423      graphtit= title of the graph ('|', for spaces)
     6424      kfig= kind of figure
     6425      figname= name of the figure
     6426    """
     6427    fname = 'plot_river_pattern'
     6428
     6429    dx=xvals.shape[1]
     6430    dy=xvals.shape[0]
     6431    xmin = np.min(xvals)
     6432    xmax = np.max(xvals)
     6433    ymin = np.min(yvals)
     6434    ymax = np.max(yvals)
     6435
     6436# flow direction
     6437
     6438    plt.rc('text', usetex=True)
     6439
     6440    ddx = np.abs(xvals[dy/2+1,dx/2] - xvals[dy/2,dx/2])
     6441    ddy = np.abs(yvals[dy/2,dx/2+1] - yvals[dy/2,dx/2])
     6442    fontcharac = {'family': 'serif', 'weight': 'normal', 'size': 3}
     6443
     6444    xlabpos = []
     6445    ylabpos = []
     6446    labels = []
     6447    labcol = []
     6448    flow = []
     6449    flowvals = []
     6450    xtrack = []
     6451    ytrack = []
     6452    colortrack = []
     6453    trackid = []
     6454    stnlL = []
     6455    stlonlL = []
     6456    stlatlL = []
     6457
     6458# Setting up colors for each label
     6459#   From: http://stackoverflow.com/questions/15235630/matplotlib-pick-up-one-color-associated-to-one-value-in-a-colorbar
     6460    my_cmap = plt.cm.get_cmap(colordescid)
     6461    vcolmin = np.min(descid)
     6462    vcolmax = np.max(descid)
     6463    print 'Lluis vcolmin:',vcolmin,'vcolmax:',vcolmax
     6464
     6465    norm = mpl.colors.Normalize(vcolmin, vcolmax)
     6466
     6467# Vector angles
     6468    lengthtrac = np.float(xvals[0,1] - xvals[0,0])
     6469    lengthtrac2 = lengthtrac*np.sqrt(2.)
     6470
     6471    for j in range(0,dy):
     6472        for i in range(0,dx):
     6473            if veccolor[j,i] != '--':
     6474#                ibeg = xvals[j,i]-lengthtrac/2.
     6475#                jbeg = yvals[j,i]-lengthtrac/2.
     6476                ibeg = xvals[j,i]
     6477                jbeg = yvals[j,i]
     6478                labels.append(int(veccolor[j,i]))
     6479                flowvals.append(fvals[j,i])
     6480                angle = (fvals[j,i] - 1)*np.pi/4
     6481                if gen.searchInlist([2,4,6,8], fvals[j,i]):
     6482                    iend = ibeg + lengthtrac2*np.sin(angle)
     6483                    jend = jbeg + lengthtrac2*np.cos(angle)
     6484                elif gen.searchInlist([1,3,5,7], fvals[j,i]):
     6485                    iend = ibeg + lengthtrac*np.sin(angle)
     6486                    jend = jbeg + lengthtrac*np.cos(angle)
     6487                else:
     6488                    ibeg = xvals[j,i]
     6489                    jbeg = yvals[j,i]
     6490                    iend = None
     6491                    jend = None
     6492
     6493                xlabpos.append(ibeg)
     6494                ylabpos.append(jbeg)
     6495                xtrack.append(ibeg)
     6496                xtrack.append(iend)
     6497                xtrack.append(None)
     6498                ytrack.append(jbeg)
     6499                ytrack.append(jend)
     6500                ytrack.append(None)
     6501                if len(desclon.shape) == 2:
     6502                    difflonlat = np.sqrt((desclon-xvals[j,i])**2 + (desclat-yvals[j,i])**2)
     6503                    mindiffLl = np.min(difflonlat)
     6504                    ilatlon = gen.index_mat(difflonlat, mindiffLl)
     6505                else:
     6506                    ilatlon = np.zeros((2), dtype=int)
     6507                    difflon = np.abs(desclon - xvals[j,i])
     6508                    mindiffl = np.min(difflon)
     6509                    ilatlon[1] = gen.index_vec(difflon,mindiffl)
     6510                    difflat = np.abs(desclat - yvals[j,i])
     6511                    mindiffL = np.min(difflat)
     6512                    ilatlon[0] = gen.index_vec(difflat,mindiffL)
     6513
     6514                if descid.mask[ilatlon[0],ilatlon[1]]:
     6515                    labcol.append(colornoriver)
     6516                    colortrack.append(colornoriver)
     6517                else:
     6518                    if veccolor[j,i] != 6:
     6519                        print 'Lluis: veccol:', veccolor[j,i], 'mindiffl', mindiffl,'mindiffL:',mindiffL
     6520                    else:
     6521                        print 'Lluis right! mindiffl', mindiffl,'mindiffL:',mindiffL
     6522                    labcol.append(coloriver)
     6523                    colortrack.append(my_cmap(norm(descid[ilatlon[0],ilatlon[1]])))
     6524
     6525                trackid.append(descid[ilatlon[0],ilatlon[1]])
     6526
     6527    totvals = len(flowvals)
     6528
     6529    if not mapv is None:
     6530        lon00 = np.where(xvals[:] < 0., 360. + xvals[:], xvals[:])
     6531        lat00 = yvals[:]
     6532
     6533        map_proj=mapv.split(',')[0]
     6534        map_res=mapv.split(',')[1]
     6535
     6536        nlon = np.min(xvals)
     6537        xlon = np.max(xvals)
     6538        nlat = np.min(yvals)
     6539        xlat = np.max(yvals)
     6540
     6541        lon2 = xvals[dy/2,dx/2]
     6542        lat2 = yvals[dy/2,dx/2]
     6543
     6544        print 'lon2:', lon2, 'lat2:', lat2, 'SW pt:', nlon, ',', nlat, 'NE pt:',     \
     6545          xlon, ',', xlat
     6546
     6547        if map_proj == 'cyl':
     6548            m = Basemap(projection=map_proj, llcrnrlon=nlon, llcrnrlat=nlat,         \
     6549              urcrnrlon=xlon, urcrnrlat= xlat, resolution=map_res)
     6550        elif map_proj == 'lcc':
     6551            m = Basemap(projection=map_proj, lat_0=lat2, lon_0=lon2, llcrnrlon=nlon, \
     6552              llcrnrlat=nlat, urcrnrlon=xlon, urcrnrlat= xlat, resolution=map_res)
     6553        else:
     6554            print errormsg
     6555            print '  ' + fname + ": projection '" + map_proj + "' not ready!!"
     6556            print '    projections available: cyl, lcc'
     6557            quit(-1)
     6558
     6559        m.drawcoastlines()
     6560        drawcountry = True
     6561        if drawcountry: m.drawcountries()
     6562
     6563        meridians = pretty_int(nlon,xlon,5)
     6564        m.drawmeridians(meridians,labels=[True,False,False,True],color="black")
     6565
     6566        parallels = pretty_int(nlat,xlat,5)
     6567        m.drawparallels(parallels,labels=[False,True,True,False],color="black")
     6568
     6569        plt.xlabel('W-E')
     6570        plt.ylabel('S-N')
     6571
     6572    j = 0
     6573    for i in range(len(xlabpos)):
     6574        plt.plot(xtrack[j:j+2], ytrack[j:j+2], color=colortrack[i])
     6575        j = j + 3
     6576
     6577# Sea-flow
     6578    for i in range(len(xlabpos)):
     6579        if flowvals[i] == 97:
     6580            plt.plot(xlabpos[i], ylabpos[i], 'x', color=colortrack[i])
     6581        elif flowvals[i] == 98:
     6582            plt.plot(xlabpos[i], ylabpos[i], '*', color=colortrack[i])
     6583        elif flowvals[i] == 99:
     6584            plt.plot(xlabpos[i], ylabpos[i], 'h', color=colortrack[i])
     6585
     6586    plt.xlim(xmin,xmax)
     6587    plt.ylim(ymin,ymax)
     6588
     6589    if drawbasinid:
     6590        for i in range(len(xlabpos)):
     6591            plt.text(xlabpos[i]+0.05*lengthtrac, ylabpos[i]+0.05*lengthtrac, labels[i],    \
     6592              color=labcol[i], fontdict=fontcharac)
     6593#            plt.text(xlabpos[i]+0.1*lengthtrac, ylabpos[i]+0.1*lengthtrac, trackid[i],   \
     6594#              color=colortrack[i], fontdict=fontcharac)
     6595#            plt.text(xlabpos[i]+0.1*lengthtrac, ylabpos[i]+0.1*lengthtrac, str(flowvals[i]),   \
     6596#              color=colortrack[i], fontdict=fontcharac)
     6597
     6598    for ist in range(len(stlon)):
     6599        if stlon[ist] > xmin and stlon[ist] < xmax and stlat[ist] > ymin and stlat[ist] < ymax:
     6600            stname = '*'
     6601            for ic in range(len(stn[ist,:])):
     6602                stname  = stname + stn[ist,ic]
     6603#            plt.annotate(stname, xy=(stlon[ist],stlat[ist]), color=colorst, )
     6604            plt.text(stlon[ist], stlat[ist], stname, color=colorst, fontsize=3)
     6605
     6606#    cbar = plt.colorbar()
     6607    plt.title(graphtit.replace('&','\&'))
     6608
     6609    output_kind(kfig, figname, True)
     6610
     6611    return
     6612
    63996613def var_3desc(ovar):
    64006614    """ Function to provide std_name, long_name and units from an object variable
Note: See TracChangeset for help on using the changeset viewer.