I'm trying to shade grids below a certain threshold a certain color. Using 
m.pcolor. Also would like to know more about how the routine I've been given, 
and am using using, (below) works. I'm fairly new to matplotlib so thanks for 
the help.

Looks like array is filled in these lines:

thevar='mean'
data=ncfile.variables[thevar]
dataa=data[:]
theshape=dataa.shape

Missing values I've chosen set here:

data.missing_value=0
try:
        mval=data.missing_value
        print " using specified missing value =",mval
except:
        mval=1.e30
        print " faking missing value=",mval
# make a masked array: using missing value(s) in mval
maskdat=ma.masked_values(slice,mval)


Map shading here, I believe:
p = m.pcolor(x,y,maskdat,shading='flat',cmap=mycolormap)

Questions. 1) How does the function know of the data array?  Then, how would I 
shade grids, with values that are less than zero, purple?

Thanks!
Mike

-------------------------------------------------

verbose=0 #verbose=2 says a bit more

import sys,getopt

from mpl_toolkits.basemap import Basemap, shiftgrid, cm 
#from netCDF3 import Dataset as NetCDFFile 
from mpl_toolkits.basemap import  NetCDFFile
from pylab import *

alloptions, otherargs= getopt.getopt(sys.argv[1:],'ro:p:X:Y:v:t:l:u:n:') # note 
the : after o and p
proj='lam'
#plotfile=None
#plotfile='testmap2.png'
usejetrev=False
colorbounds=[None,None]
extratext=""
xvar=None
yvar=None
thevar=None

#thetitle='Mean Snow Mass, January-March 1980s, HADCM3_HRM3'
#thetitle='Mean Snow Depth, January-March 1980s, CGCM3_CRCM'
#thetitle='Mean Snow Depth, January-March 2060s, CGCM3_CRCM'
#thetitle='Mean Snow Depth, January-March 1980s, CCSM_WRFG'
#thetitle='Mean Snow Depth, January-March 2060s, CCSM_WRFG'
#thetitle='Mean Snow Depth, January-March 1980s, HADCM3_HRM3'
#thetitle='Mean Snow Depth, January-March 2060s, HADCM3_HRM3'

#thetitle='Mean Snow Depth, January-March 1980s, MultiModel Mean'
thetitle='Mean Snow Depth, January-March 2060s, MultiModel Mean'

therec=None
thelev=None
cbot=None
ctop=None
startlon=-180 #default assumption for starting longitude
for theopt,thearg in alloptions:
        print theopt,thearg
        if theopt=='-o': # -o needs filename after it, which is now thearg
                plotfile=thearg 
        elif theopt=='-p': 
                proj=thearg
        elif theopt=='-X': 
                xvar=thearg
        elif theopt=='-Y': 
                yvar=thearg
        elif theopt=='-v': 
                thevar=thearg
        elif theopt=='-t': 
                thetitle=thearg
        elif theopt=='-l': 
                cbot=thearg
        elif theopt=='-u': 
                ctop=thearg
        elif theopt=='-n': 
                therec=thearg
        elif theopt=='-m': 
                thelev=thearg
        elif theopt=='-r': 
                usejetrev=True
        else: #something went wrong
                print "hmm, what are these??? ", theopt, thearg
                sys.exit()


print otherargs
try:
        ncname=otherargs[0]
        ncfile = NetCDFFile(ncname, 'r')
except:
#       ncname = raw_input("\nenter NetCDF file name =>")
#       ncfile = NetCDFFile(ncname, 'r')
        ncfile = NetCDFFile('simple_xy.nc', 'r')   # Here's filename
        
if verbose>0:  #examine the NetCDF file
        print "GLOBAL ATTRIBUTES:"
        allattr=dir(ncfile)
        normalattr=dir(NetCDFFile('/tmp/throwaway.nc','w'))
        for item in allattr:
                if item not in normalattr: print item,': ',getattr(ncfile,item)
#       for name in ncfile.ncattrs():
#                       print name,'=', getattr(ncfile,name)
#                       if name=='Conventions' and 
getattr(ncfile,name)=='COARDS':
#                               nmcrean=True
#                               startlon=0.
#                               print "guessing this is an NMC reananalysis 
file"
#                       else:
#                               nmcrean=False
        print "\n\nDIMENSIONS:"
        for name in ncfile.dimensions.keys():
                print "\nDIMENSION:",
                try:
                        print name, ncfile.variables[name][:]
                except:
                        print name, ncfile.dimensions[name]
                try:
                        print '   ',ncfile.variables[name].units
                except:
                        pass
                try:
                        print '   ',ncfile.variables[name].gridtype
                except:
                        pass
        print "\n'*****************'\nVARIABLES:"
        for name in ncfile.variables.keys():
                if name in ncfile.dimensions.keys(): continue
                print "\nVARIABLE:",
                print name, ncfile.variables[name].dimensions,
                try:
                        print '   ',ncfile.variables[name].units
                except:
                        pass
                try:
                        print "   missing 
value=",ncfile.variables[name].missing_value
                except:
                        pass
#
print "********************\n"
#if not xvar: xvar=raw_input("\nenter X variable=>")
xvar='rlon'
print "shape of "+xvar+': ',ncfile.variables[xvar].shape
if ncfile.variables[xvar][:].ndim ==1:
        print "X is independent of Y"
        lon1d=ncfile.variables[xvar][:]
else:
        lon1d=False
        if  ncfile.variables[xvar][:].ndim ==2: lon2d=ncfile.variables[xvar][:]
        if  ncfile.variables[xvar][:].ndim ==3: 
lon2d=ncfile.variables[xvar][0,:,:] #WRF
        print "shape of lond2d:", lon2d.shape


#print type(lon1d),lon1d,type(lon1d[1]),lon1d[1]
#
#if not yvar: yvar=raw_input("\nenter Y variable=>")
yvar='rlat'
print "shape of "+yvar+': ',ncfile.variables[yvar].shape
if ncfile.variables[yvar][:].ndim ==1:
        print "Y is independent of X"
        lat1d=ncfile.variables[yvar][:]
else:
        lat1d=False
        if  ncfile.variables[yvar][:].ndim ==2: lat2d=ncfile.variables[yvar][:]
        if  ncfile.variables[yvar][:].ndim ==3: 
lat2d=ncfile.variables[yvar][0,:,:] #WRF
        print "shape of lat2d:", lat2d.shape
#
#if not thevar: thevar=raw_input("\nenter variable to plot=>")
#thevar='nseasondays'
#thevar='diff'
thevar='mean'
data=ncfile.variables[thevar]
dataa=data[:]
theshape=dataa.shape
try:
        add_offset=ncfile.variables[thevar].add_offset
        print "will use add_offset=",add_offset
except:
        add_offset=0.   
print "shape of "+thevar+': ',theshape
if len(theshape)>2:
        print "there are apparently",theshape[0],"records"
        if not therec: therec=raw_input("enter record number to plot=>")
        therec=int(therec)
        extratext=" rec=%d" %therec
if len(theshape)>3:
        print "there are apparently",theshape[1],"levels"
        if not thelev: thelev=raw_input("enter level number to plot=>")
        thelev=int(thelev)
        extratext=extratext+" lev=%d" %thelev
if len(theshape)>3: 
        slice=dataa[therec,thelev,:,:]+add_offset
elif len(theshape)>2: 
        slice=dataa[therec,:,:]+add_offset
else:
        slice=dataa+add_offset

data.missing_value=0
#data.missing_value=-999
try:
        mval=data.missing_value
        print " using specified missing value =",mval
except:
        mval=1.e30
        print " faking missing value=",mval
# make a masked array: using missing value(s) in mval
maskdat=ma.masked_values(slice,mval)
datamax=max(maskdat.compressed().flat)
datamin=min(maskdat.compressed().flat)
print "\n"+thevar+" has maximum ", datamax,"  and minimum:", datamin

#colorbounds=[None,None]
#if not cbot: cbot=raw_input("enter lower bound on color scale =>")
#if cbot: colorbounds[0]=float(cbot)
#if not ctop: ctop=raw_input("enter upper bound on color scale =>")
#if ctop: colorbounds[1]=float(ctop)

#colorbounds=[-10,90]            # for diff in days
colorbounds=[0,100]            
print "using clim=",colorbounds


#
# shift lons and lats by 1/2 grid increment (so values represent the vertices
# of the grid box surrounding the data value, as pcolor expects).
if type(lon1d)!=type(False): #lon1d does exist
        delon = lon1d[1]-lon1d[0]
        delat = lat1d[1]-lat1d[0]
        lons = zeros(len(lon1d)+1,'d')
        lats = zeros(len(lat1d)+1,'d')
        lons[0:len(lon1d)] = lon1d-0.5*delon
        lons[-1] = lon1d[-1]+0.5*delon
        lats[0:len(lat1d)] = lat1d-0.5*delon
        lats[-1] = lat1d[-1]+0.5*delon
        lons, lats = meshgrid(lons, lats)
else: 
        xdim,ydim=lon2d.shape
        lons=zeros([xdim+1,ydim+1],'d')
        lats=zeros([xdim+1,ydim+1],'d')
        for i in range(1,xdim):
                for j in range(1,ydim):
                        lats[i,j]=.5*lat2d[i,j]+.5*lat2d[i-1,j-1]               
         
                        lons[i,j]=.5*lon2d[i,j]+.5*lon2d[i-1,j-1]               
         
        for i in range(1,xdim):
                lons[i,-1]=-lons[i,-3]+2*lons[i,-2]                      
                lats[i,-1]=-lats[i,-3]+2*lats[i,-2]                      
                lons[i,0]=-lons[i,2]+2*lons[i,1]                         
                lats[i,0]=-lats[i,2]+2*lats[i,1]                         
        for j in range(ydim+1):
                lons[-1,j]=-lons[-3,j]+2*lons[-2,j]                      
                lats[-1,j]=-lats[-3,j]+2*lats[-2,j]                      
                lons[0,j]=2*lons[1,j]-lons[2,j]                          
                lats[0,j]=2*lats[1,j]-lats[2,j]                          
#
# alter a matplotlib color table, 
# cm.jet is very useful scheme, but reversed colors are better for drought 
colordict=cm.jet._segmentdata.copy() # dictionary ('blue', 'green', 'red') of 
nested tuples
for k in colordict.keys():
        colordict[k]=[list(q) for q in colordict[k]] #convert nested tuples to 
nested list
        for a in colordict[k]: 
                a[0]=1.-a[0] #in inner list, change normalized value to 1 - 
value.
        colordict[k].reverse() #reverse order of outer list
jetrev =  cm.colors.LinearSegmentedColormap("jetrev",  colordict)
# jetrev can now be used in place of cm.jet
#
# setup of basemap ('lcc' = lambert conformal conic).
# use major and minor sphere radii from WGS84 ellipsoid.
print "\nPlotting, please wait...maybe more than 10 seconds"
if proj=='lam': #Lambert Conformal
        m = 
Basemap(llcrnrlon=-118.0,llcrnrlat=24.,urcrnrlon=-60.0,urcrnrlat=48.0,\
            resolution='l',area_thresh=1000.,projection='lcc',\
            lat_1=70.,lon_0=-98.)
        xtxt=200000. #offset for text
        ytxt=200000.
        parallels = arange(20.,50.,10.)
#       meridians = arange(10.,360.,10.)
        meridians = arange(-130.,-50.,20.)
else: #cylindrical is default
#       m = Basemap(llcrnrlon=-180.,llcrnrlat=-90,urcrnrlon=180.,urcrnrlat=90.,\
#            resolution='c',area_thresh=10000.,projection='cyl')
        m = 
Basemap(llcrnrlon=startlon,llcrnrlat=-90,urcrnrlon=startlon+360.,urcrnrlat=90.,\
            resolution='c',area_thresh=10000.,projection='cyl')
        xtxt=1.
        ytxt=0.
        parallels = arange(-90.,90.,30.)
        if startlon==-180:
                meridians = arange(-180.,180.,60.)
        else:
                meridians = arange(0.,360.,60.)

if verbose>1: print m.__doc__ 
xsize = rcParams['figure.figsize'][0]
fig=figure(figsize=(xsize,m.aspect*xsize))
ax = fig.add_axes([0.08,0.1,0.7,0.7],axisbg='white')
# make a pcolor plot.
x, y = m(lons, lats)
mycolormap=cm.jet
if usejetrev:
        mycolormap=jetrev
        print "using reverse of cm.jet"
p = m.pcolor(x,y,maskdat,shading='flat',cmap=mycolormap)
clim(*colorbounds)
cax = axes([0.85, 0.1, 0.05, 0.7]) # setup colorbar axes
#if datamax>1000.:
#       colorbar(format='%7.1e', cax=cax) # draw colorbar
#elif datamax>5.:
#       colorbar(format='%d', cax=cax) # draw colorbar
#else:
#       colorbar(format='%5.2f', cax=cax) # draw colorbar
colorbar(format='%d', cax=cax)
text(0.7,1.02,'mm')

axes(ax)  # make the original axes current again

# plot blue dot on Norman OK and label it as such.
#if startlon==-180:
#       xpt,ypt = m(-97.4836,35.2556) 
#else:
#       xpt,ypt = m(-97.4836+360.,35.2556) 
#m.plot([xpt],[ypt],'bo') 
#text(xpt+xtxt,ypt+ytxt,'Norman')

# draw coastlines and political boundaries.
m.drawcoastlines()
m.drawcountries()
m.drawstates()
# draw parallels and meridians.
# label on left, right and bottom of map.
m.drawparallels(parallels,labels=[1,1,0,0])
m.drawmeridians(meridians,labels=[1,1,0,1])
if not thetitle:
        title(thevar+extratext)
else:
        title(thetitle)
        
#if plotfile:
#       savefig(plotfile, dpi=72, facecolor='w', bbox_inches='tight', 
edgecolor='w', orientation='portrait')
#else:
#       show()

plt.savefig('map.png')
#  comment show to mass produce

 


 
____________________________________________________________________________________
Now that's room service!  Choose from over 150,000 hotels
in 45,000 destinations on Yahoo! Travel to find your fit.
http://farechase.yahoo.com/promo-generic-14795097

------------------------------------------------------------------------------
The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
Pinpoint memory and threading errors before they happen.
Find and fix more than 250 security defects in the development cycle.
Locate bottlenecks in serial and parallel code that limit performance.
http://p.sf.net/sfu/intel-dev2devfeb
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to