Revision: 8332
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8332&view=rev
Author:   jswhit
Date:     2010-05-23 12:31:00 +0000 (Sun, 23 May 2010)

Log Message:
-----------
add support for unstructured meshes in pcolor, contour, contourf methods.

Modified Paths:
--------------
    trunk/toolkits/basemap/Changelog
    trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py

Added Paths:
-----------
    trunk/toolkits/basemap/examples/C02562.orog.nc
    trunk/toolkits/basemap/examples/ploticos.py

Modified: trunk/toolkits/basemap/Changelog
===================================================================
--- trunk/toolkits/basemap/Changelog    2010-05-21 18:26:12 UTC (rev 8331)
+++ trunk/toolkits/basemap/Changelog    2010-05-23 12:31:00 UTC (rev 8332)
@@ -1,7 +1,11 @@
 version 0.99.5 (not yet released)
+           * add support for plotting on unstructured grids using
+             keyword 'tri' in pcolor,contour,contourf methods (which
+             then forward to tripcolor, tricontour, tricontourf axes
+             methods).
           * let continents that fill the whole map be filled.
            * added option for cubic spline interpolation in interp function
-           (order=3) using scipy.ndimage.
+             (order=3) using scipy.ndimage.
            * added "near-sided perspective" projection for a satellite
            view at an arbitrary altitude.
            * patch from Stephane Raynaud to pass format string to

Added: trunk/toolkits/basemap/examples/C02562.orog.nc
===================================================================
(Binary files differ)


Property changes on: trunk/toolkits/basemap/examples/C02562.orog.nc
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/toolkits/basemap/examples/ploticos.py
===================================================================
--- trunk/toolkits/basemap/examples/ploticos.py                         (rev 0)
+++ trunk/toolkits/basemap/examples/ploticos.py 2010-05-23 12:31:00 UTC (rev 
8332)
@@ -0,0 +1,15 @@
+from mpl_toolkits.basemap import Basemap, NetCDFFile
+import matplotlib.pyplot as plt
+import numpy as np
+# read in orography of icosahedral global grid.
+f = NetCDFFile('C02562.orog.nc')
+lons = (180./np.pi)*f.variables['grid_center_lon'][:]
+lats = (180./np.pi)*f.variables['grid_center_lat'][:]
+z = f.variables['zs'][:]
+map = Basemap(projection='ortho',lon_0=-105,lat_0=40)
+x,y = map(lons, lats)
+map.drawcoastlines()
+map.drawmapboundary()
+# tri=True forwards to axes.tripcolor
+map.pcolor(x,y,z,tri=True,shading='faceted')
+plt.show()

Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py
===================================================================
--- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2010-05-21 
18:26:12 UTC (rev 8331)
+++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2010-05-23 
12:31:00 UTC (rev 8332)
@@ -2730,7 +2730,7 @@
         self.set_axes_limits(ax=ax)
         return ret
 
-    def pcolor(self,x,y,data,**kwargs):
+    def pcolor(self,x,y,data,tri=False,**kwargs):
         """
         Make a pseudo-color plot over the map
         (see matplotlib.pyplot.pcolor documentation).
@@ -2739,22 +2739,35 @@
         they will be convert to masked arrays with those values masked.
         As a result, those values will not be plotted.
 
+        If ``tri`` is set to ``True``, an unstructured grid is assumed
+        (x,y,data must be 1-d) and matplotlib.pyplot.tricolor is used.
+
         Extra keyword ``ax`` can be used to override the default axis instance.
 
-        Other \**kwargs passed on to matplotlib.pyplot.pcolor.
+        Other \**kwargs passed on to matplotlib.pyplot.pcolor (or tricolor if
+        ``tri=True``).
         """
         ax, plt = self._ax_plt_from_kw(kwargs)
-        # make x,y masked arrays
-        # (masked where data is outside of projection limb)
-        x = ma.masked_values(np.where(x > 1.e20,1.e20,x), 1.e20)
-        y = ma.masked_values(np.where(y > 1.e20,1.e20,y), 1.e20)
         # allow callers to override the hold state by passing hold=True|False
         b = ax.ishold()
         h = kwargs.pop('hold',None)
         if h is not None:
             ax.hold(h)
         try:
-            ret =  ax.pcolor(x,y,data,**kwargs)
+            if tri:
+                # for unstructured grids, toss out points outside
+                # projection limb (don't use those points in triangulation).
+                mask = np.logical_or(x<1.e20,y<1.e20)
+                x = np.compress(mask,x)
+                y = np.compress(mask,y)
+                data = np.compress(mask,data)
+                ret = ax.tripcolor(x,y,data,**kwargs)
+            else:
+                # make x,y masked arrays
+                # (masked where data is outside of projection limb)
+                x = ma.masked_values(np.where(x > 1.e20,1.e20,x), 1.e20)
+                y = ma.masked_values(np.where(y > 1.e20,1.e20,y), 1.e20)
+                ret = ax.pcolor(x,y,data,**kwargs)
         except:
             ax.hold(b)
             raise
@@ -2801,40 +2814,51 @@
 
         Extra keyword ``ax`` can be used to override the default axis instance.
 
-        Other \*args and \**kwargs passed on to matplotlib.pyplot.contour.
+        If ``tri`` is set to ``True``, an unstructured grid is assumed
+        (x,y,data must be 1-d) and matplotlib.pyplot.tricontour is used.
+
+        Other \*args and \**kwargs passed on to matplotlib.pyplot.contour
+        (or tricontour if ``tri=True``).
         """
         ax, plt = self._ax_plt_from_kw(kwargs)
-        # make sure x is monotonically increasing - if not,
-        # print warning suggesting that the data be shifted in longitude
-        # with the shiftgrid function.
-        # only do this check for global projections.
-        if self.projection in _cylproj + _pseudocyl:
-            xx = x[x.shape[0]/2,:]
-            condition = (xx >= self.xmin) & (xx <= self.xmax)
-            xl = xx.compress(condition).tolist()
-            xs = xl[:]
-            xs.sort()
-            if xl != xs:
-                print dedent("""
-                     WARNING: x coordinate not montonically increasing - 
contour plot
-                     may not be what you expect.  If it looks odd, your can 
either
-                     adjust the map projection region to be consistent with 
your data, or
-                     (if your data is on a global lat/lon grid) use the 
shiftgrid
-                     function to adjust the data to be consistent with the map 
projection
-                     region (see examples/contour_demo.py).""")
-        # mask for points outside projection limb.
-        xymask = np.logical_or(np.greater(x,1.e20),np.greater(y,1.e20))
-        data = ma.asarray(data)
-        # combine with data mask.
-        mask = np.logical_or(ma.getmaskarray(data),xymask)
-        data = ma.masked_array(data,mask=mask)
         # allow callers to override the hold state by passing hold=True|False
         b = ax.ishold()
         h = kwargs.pop('hold',None)
         if h is not None:
             ax.hold(h)
         try:
-            CS = ax.contour(x,y,data,*args,**kwargs)
+            if kwargs.has_key('tri') and kwargs['tri']:
+                mask = np.logical_or(x<1.e20,y<1.e20)
+                x = np.compress(mask,x)
+                y = np.compress(mask,y)
+                data = np.compress(mask,data)
+                CS = ax.tricontour(x,y,data,*args,**kwargs)
+            else:
+                # make sure x is monotonically increasing - if not,
+                # print warning suggesting that the data be shifted in 
longitude
+                # with the shiftgrid function.
+                # only do this check for global projections.
+                if self.projection in _cylproj + _pseudocyl:
+                    xx = x[x.shape[0]/2,:]
+                    condition = (xx >= self.xmin) & (xx <= self.xmax)
+                    xl = xx.compress(condition).tolist()
+                    xs = xl[:]
+                    xs.sort()
+                    if xl != xs:
+                        print dedent("""
+                             WARNING: x coordinate not montonically increasing 
- contour plot
+                             may not be what you expect.  If it looks odd, 
your can either
+                             adjust the map projection region to be consistent 
with your data, or
+                             (if your data is on a global lat/lon grid) use 
the shiftgrid
+                             function to adjust the data to be consistent with 
the map projection
+                             region (see examples/contour_demo.py).""")
+                # mask for points outside projection limb.
+                xymask = np.logical_or(np.greater(x,1.e20),np.greater(y,1.e20))
+                data = ma.asarray(data)
+                # combine with data mask.
+                mask = np.logical_or(ma.getmaskarray(data),xymask)
+                data = ma.masked_array(data,mask=mask)
+                CS = ax.contour(x,y,data,*args,**kwargs)
         except:
             ax.hold(b)
             raise
@@ -2856,48 +2880,59 @@
 
         Extra keyword 'ax' can be used to override the default axis instance.
 
-        Other \*args and \**kwargs passed on to matplotlib.pyplot.scatter.
+        If ``tri`` is set to ``True``, an unstructured grid is assumed
+        (x,y,data must be 1-d) and matplotlib.pyplot.tricontourf is used.
+
+        Other \*args and \**kwargs passed on to matplotlib.pyplot.contourf
+        (or tricontourf if ``tri=True``).
         """
         ax, plt = self._ax_plt_from_kw(kwargs)
-        # make sure x is monotonically increasing - if not,
-        # print warning suggesting that the data be shifted in longitude
-        # with the shiftgrid function.
-        # only do this check for global projections.
-        if self.projection in _cylproj + _pseudocyl:
-            xx = x[x.shape[0]/2,:]
-            condition = (xx >= self.xmin) & (xx <= self.xmax)
-            xl = xx.compress(condition).tolist()
-            xs = xl[:]
-            xs.sort()
-            if xl != xs:
-                print dedent("""
-                     WARNING: x coordinate not montonically increasing - 
contour plot
-                     may not be what you expect.  If it looks odd, your can 
either
-                     adjust the map projection region to be consistent with 
your data, or
-                     (if your data is on a global lat/lon grid) use the 
shiftgrid
-                     function to adjust the data to be consistent with the map 
projection
-                     region (see examples/contour_demo.py).""")
-        # mask for points outside projection limb.
-        xymask = np.logical_or(np.greater(x,1.e20),np.greater(y,1.e20))
-        # mask outside projection region (workaround for contourf bug?)
-        epsx = 0.1*(self.xmax-self.xmin)
-        epsy = 0.1*(self.ymax-self.ymin)
-        outsidemask = np.logical_or(np.logical_or(x > self.xmax+epsx,\
-                                    x < self.xmin-epsy),\
-                                    np.logical_or(y > self.ymax+epsy,\
-                                    y < self.ymin-epsy))
-        data = ma.asarray(data)
-        # combine masks.
-        mask = \
-        np.logical_or(outsidemask,np.logical_or(ma.getmaskarray(data),xymask))
-        data = ma.masked_array(data,mask=mask)
         # allow callers to override the hold state by passing hold=True|False
         b = ax.ishold()
         h = kwargs.pop('hold',None)
         if h is not None:
             ax.hold(h)
         try:
-            CS = ax.contourf(x,y,data,*args,**kwargs)
+            if kwargs.has_key('tri') and kwargs['tri']:
+                mask = np.logical_or(x<1.e20,y<1.e20)
+                x = np.compress(mask,x)
+                y = np.compress(mask,y)
+                data = np.compress(mask,data)
+                CS = ax.tricontourf(x,y,data,*args,**kwargs)
+            else:
+                # make sure x is monotonically increasing - if not,
+                # print warning suggesting that the data be shifted in 
longitude
+                # with the shiftgrid function.
+                # only do this check for global projections.
+                if self.projection in _cylproj + _pseudocyl:
+                    xx = x[x.shape[0]/2,:]
+                    condition = (xx >= self.xmin) & (xx <= self.xmax)
+                    xl = xx.compress(condition).tolist()
+                    xs = xl[:]
+                    xs.sort()
+                    if xl != xs:
+                        print dedent("""
+                             WARNING: x coordinate not montonically increasing 
- contour plot
+                             may not be what you expect.  If it looks odd, 
your can either
+                             adjust the map projection region to be consistent 
with your data, or
+                             (if your data is on a global lat/lon grid) use 
the shiftgrid
+                             function to adjust the data to be consistent with 
the map projection
+                             region (see examples/contour_demo.py).""")
+                # mask for points outside projection limb.
+                xymask = np.logical_or(np.greater(x,1.e20),np.greater(y,1.e20))
+                # mask outside projection region (workaround for contourf bug?)
+                epsx = 0.1*(self.xmax-self.xmin)
+                epsy = 0.1*(self.ymax-self.ymin)
+                outsidemask = np.logical_or(np.logical_or(x > self.xmax+epsx,\
+                                            x < self.xmin-epsy),\
+                                            np.logical_or(y > self.ymax+epsy,\
+                                            y < self.ymin-epsy))
+                data = ma.asarray(data)
+                # combine masks.
+                mask = \
+                
np.logical_or(outsidemask,np.logical_or(ma.getmaskarray(data),xymask))
+                data = ma.masked_array(data,mask=mask)
+                CS = ax.contourf(x,y,data,*args,**kwargs)
         except:
             ax.hold(b)
             raise


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

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

_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to