source: trunk/MESOSCALE/PLOT/PYTHON/mylib/myplot.py @ 184

Last change on this file since 184 was 184, checked in by aslmd, 14 years ago

MESOSCALE: much improved python scripts for winds. lots of automatic settings.

File size: 8.4 KB
Line 
1def latinterv (area):
2        if   area == "Europe": 
3                wlat = [20.,80.]
4                wlon = [-50.,50.]
5        elif area == "Central_America":
6                wlat = [-10.,40.]
7                wlon = [230.,300.]
8        elif area == "Africa":
9                wlat = [-20.,50.]
10                wlon = [-50.,50.]
11        elif area == "Whole":
12                wlat = [-90.,90.]
13                wlon = [-180.,180.]
14        elif area == "Southern_Hemisphere":
15                wlat = [-90.,60.]
16                wlon = [-180.,180.]
17        elif area == "Northern_Hemisphere":
18                wlat = [-60.,90.]
19                wlon = [-180.,180.]
20        elif area == "Tharsis":
21                wlat = [-30.,60.]
22                wlon = [-170.,-10.]
23        elif area == "Whole_No_High":
24                wlat = [-60.,60.]
25                wlon = [-180.,180.]
26        elif area == "Chryse":
27                wlat = [-60.,60.]
28                wlon = [-60.,60.]
29        elif area == "North_Pole":
30                wlat = [60.,90.]
31                wlon = [-180.,180.]
32        elif area == "Close_North_Pole":
33                wlat = [75.,90.]
34                wlon = [-180.,180.]
35        return wlon,wlat
36
37def getproj (nc):
38    map_proj = getattr(nc, 'MAP_PROJ')
39    cen_lat  = getattr(nc, 'CEN_LAT')
40    if map_proj == 2:
41        if cen_lat > 10.:   
42            proj="npstere"
43            print "NP stereographic polar domain" 
44        else:           
45            proj="spstere"
46            print "SP stereographic polar domain"
47    elif map_proj == 1: 
48        print "lambert projection domain" 
49        proj="lcc"
50    elif map_proj == 3: 
51        print "mercator projection"
52        proj="merc"
53    return proj   
54
55def ptitle (name):
56    from matplotlib.pyplot import title
57    title(name)
58    print name
59
60def simplinterv (lon2d,lat2d):
61    import numpy as np
62    return [[np.min(lon2d),np.max(lon2d)],[np.min(lat2d),np.max(lat2d)]]
63
64def wrfinterv (lon2d,lat2d):
65    nx = len(lon2d[0,:])-1
66    ny = len(lon2d[:,0])-1
67    return [[lon2d[0,0],lon2d[nx,ny]],[lat2d[0,0],lat2d[nx,ny]]]
68
69def makeplotpngres (filename,res,pad_inches_value=0.25,folder='',disp=True):
70    import  matplotlib.pyplot as plt
71    res = int(res)
72    if folder != '':      name = folder+'/'+filename+str(res)+".png"
73    else:                 name = filename+str(res)+".png"
74    plt.savefig(name,dpi=res,bbox_inches='tight',pad_inches=pad_inches_value)
75    if disp:              display(name)         
76    return
77
78def makeplotpng (filename,pad_inches_value=0.25,minres=100.,folder=''):
79    makeplotpngres(filename,minres,     pad_inches_value=pad_inches_value,folder=folder)
80    makeplotpngres(filename,minres+200.,pad_inches_value=pad_inches_value,folder=folder,disp=False)
81    return
82
83def dumpbdy (field):
84    nx = len(field[0,:])-1
85    ny = len(field[:,0])-1
86    return field[5:ny-5,5:nx-5]
87
88def getcoord2d (nc,nlat='XLAT',nlon='XLONG',is1d=False):
89    import numpy as np
90    if is1d:
91        lat = nc.variables[nlat][:]
92        lon = nc.variables[nlon][:]
93        [lon2d,lat2d] = np.meshgrid(lon,lat)
94    else:
95        lat = nc.variables[nlat][0,:,:]
96        lon = nc.variables[nlon][0,:,:]
97        [lon2d,lat2d] = [lon,lat]
98    return lon2d,lat2d
99
100def smooth (field, coeff):
101        ## actually blur_image could work with different coeff on x and y
102        if coeff > 1:   result = blur_image(field,int(coeff))
103        else:           result = field
104        return result
105
106def gauss_kern(size, sizey=None):
107        import numpy as np
108        ## FROM COOKBOOK http://www.scipy.org/Cookbook/SignalSmooth     
109        # Returns a normalized 2D gauss kernel array for convolutions
110        size = int(size)
111        if not sizey:
112                sizey = size
113        else:
114                sizey = int(sizey)
115        x, y = np.mgrid[-size:size+1, -sizey:sizey+1]
116        g = np.exp(-(x**2/float(size)+y**2/float(sizey)))
117        return g / g.sum()
118
119def blur_image(im, n, ny=None) :
120        from scipy.signal import convolve
121        ## FROM COOKBOOK http://www.scipy.org/Cookbook/SignalSmooth
122        # blurs the image by convolving with a gaussian kernel of typical size n.
123        # The optional keyword argument ny allows for a different size in the y direction.
124        g = gauss_kern(n, sizey=ny)
125        improc = convolve(im, g, mode='same')
126        return improc
127
128def vectorfield (u, v, x, y, stride=3, scale=15., factor=250., color='black', csmooth=1, key=True):
129    ## scale regle la reference du vecteur
130    ## factor regle toutes les longueurs (dont la reference). l'AUGMENTER pour raccourcir les vecteurs.
131    import  matplotlib.pyplot               as plt
132    import  numpy                           as np
133    posx = np.max(x) + np.std(x) / 3.  ## pb pour les domaines globaux ...
134    posy = np.mean(y)
135    #posx = np.min(x)
136    #posy = np.max(x)
137    u = smooth(u,csmooth)
138    v = smooth(v,csmooth)
139    widthvec = 0.005 #0.003
140    q = plt.quiver( x[::stride,::stride],\
141                    y[::stride,::stride],\
142                    u[::stride,::stride],\
143                    v[::stride,::stride],\
144                    angles='xy',color=color,\
145                    scale=factor,width=widthvec )
146    if color=='white':     kcolor='black'
147    elif color=='yellow':  kcolor=color
148    else:                  kcolor=color
149    if key: p = plt.quiverkey(q,posx,posy,scale,\
150                   str(int(scale)),coordinates='data',color=kcolor)
151    return 
152
153def display (name):
154    from os import system
155    system("display "+name+" > /dev/null 2> /dev/null &")
156    return name
157
158def findstep (wlon):
159    steplon = int((wlon[1]-wlon[0])/4.)  #3
160    step = 120.
161    while step > steplon and step > 15. :       step = step / 2.
162    if step <= 15.:
163        while step > steplon and step > 5.  :   step = step - 5.
164    if step <= 5.:
165        while step > steplon and step > 1.  :   step = step - 1.
166    if step <= 1.:
167        step = 1. 
168    return step
169
170def define_proj (char,wlon,wlat,back="."):
171    from    mpl_toolkits.basemap            import Basemap
172    import  numpy                           as np
173    import  matplotlib                      as mpl
174    meanlon = 0.5*(wlon[0]+wlon[1])
175    meanlat = 0.5*(wlat[0]+wlat[1])
176    if   wlat[0] >= 80.:   blat =  40. 
177    elif wlat[0] <= -80.:  blat = -40. 
178    else:                  blat = wlat[0]
179    h = 2000.
180    radius = 3397200
181    if   char == "cyl":     m = Basemap(rsphere=radius,projection='cyl',\
182                              llcrnrlat=wlat[0],urcrnrlat=wlat[1],llcrnrlon=wlon[0],urcrnrlon=wlon[1])
183    elif char == "moll":    m = Basemap(rsphere=radius,projection='moll',lon_0=meanlon)
184    elif char == "ortho":   m = Basemap(rsphere=radius,projection='ortho',lon_0=meanlon,lat_0=meanlat)
185    elif char == "lcc":     m = Basemap(rsphere=radius,projection='lcc',lat_1=meanlat,lat_0=meanlat,lon_0=meanlon,\
186                              llcrnrlat=wlat[0],urcrnrlat=wlat[1],llcrnrlon=wlon[0],urcrnrlon=wlon[1])
187    elif char == "npstere": m = Basemap(rsphere=radius,projection='npstere', boundinglat=blat, lon_0=0.)
188    elif char == "spstere": m = Basemap(rsphere=radius,projection='spstere', boundinglat=blat, lon_0=0.)
189    elif char == "nsper":   m = Basemap(rsphere=radius,projection='nsper',lon_0=meanlon,lat_0=meanlat,satellite_height=h*1000.)
190    elif char == "merc":    m = Basemap(rsphere=radius,projection='merc',lat_ts=0.,\
191                              llcrnrlat=wlat[0],urcrnrlat=wlat[1],llcrnrlon=wlon[0],urcrnrlon=wlon[1])
192    fontsizemer = int(mpl.rcParams['font.size']*3./4.)
193    if char in ["cyl","lcc","merc"]:   step = findstep(wlon)
194    else:                              step = 10.
195    m.drawmeridians(np.r_[-180.:180.:step*2.], labels=[0,0,0,1], color='grey', fontsize=fontsizemer)
196    m.drawparallels(np.r_[-90.:90.:step], labels=[1,0,0,0], color='grey', fontsize=fontsizemer)
197    if back == ".":      m.warpimage(marsmap(),scale=0.75)
198    elif back == None:   pass 
199    else:                m.warpimage(marsmap(back),scale=0.75)
200    return m
201
202def marsmap (whichone="vishires"):
203        whichlink =     { \
204                "vis":          "http://maps.jpl.nasa.gov/pix/mar0kuu2.jpg",\
205                "vishires":     "http://users.info.unicaen.fr/~karczma/TEACH/InfoGeo/Images/Planets/MarsMap_2500x1250.jpg",\
206                "mola":         "http://www.lns.cornell.edu/~seb/celestia/mars-mola-2k.jpg",\
207                "molabw":       "http://users.info.unicaen.fr/~karczma/TEACH/InfoGeo/Images/Planets/MarsElevation_2500x1250.jpg",\
208                        }
209        if whichone not in whichlink: 
210                print "marsmap: choice not defined... you'll get the default one... "
211                whichone = "vishires" 
212        return whichlink[whichone]
213
214def earthmap (whichone):
215        if   whichone == "contrast":    whichlink="http://users.info.unicaen.fr/~karczma/TEACH/InfoGeo/Images/Planets/EarthMapAtmos_2500x1250.jpg"
216        elif whichone == "bw":          whichlink="http://users.info.unicaen.fr/~karczma/TEACH/InfoGeo/Images/Planets/EarthElevation_2500x1250.jpg"
217        elif whichone == "nice":        whichlink="http://users.info.unicaen.fr/~karczma/TEACH/InfoGeo/Images/Planets/earthmap1k.jpg"
218        return whichlink
219
Note: See TracBrowser for help on using the repository browser.