Revision: 7131
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7131&view=rev
Author:   mdboom
Date:     2009-05-22 14:00:12 +0000 (Fri, 22 May 2009)

Log Message:
-----------
Fix problem with polar grid lines by specifying the number of interpolation 
steps on a per-Path basis.  This isn't really a public API -- it is intended 
for internal use only.

Modified Paths:
--------------
    trunk/matplotlib/doc/api/api_changes.rst
    trunk/matplotlib/examples/api/custom_projection_example.py
    trunk/matplotlib/examples/pylab_examples/polar_bar.py
    trunk/matplotlib/lib/matplotlib/axis.py
    trunk/matplotlib/lib/matplotlib/cbook.py
    trunk/matplotlib/lib/matplotlib/lines.py
    trunk/matplotlib/lib/matplotlib/path.py
    trunk/matplotlib/lib/matplotlib/projections/polar.py
    trunk/matplotlib/lib/matplotlib/transforms.py

Modified: trunk/matplotlib/doc/api/api_changes.rst
===================================================================
--- trunk/matplotlib/doc/api/api_changes.rst    2009-05-21 21:06:49 UTC (rev 
7130)
+++ trunk/matplotlib/doc/api/api_changes.rst    2009-05-22 14:00:12 UTC (rev 
7131)
@@ -17,6 +17,14 @@
 .. _configobj: http://www.voidspace.org.uk/python/configobj.html
 .. _`enthought.traits`: http://code.enthought.com/projects/traits
 
+Changes beyond 0.98.x
+=====================
+
+* Polar plots no longer accept a resolution kwarg.  Instead, each Path
+  must specify its own number of interpolation steps.  This is
+  unlikely to be a user-visible change -- if interpolation of data is
+  required, that should be done before passing it to matplotlib.
+
 Changes for 0.98.x
 ==================
 * psd(), csd(), and cohere() will now automatically wrap negative

Modified: trunk/matplotlib/examples/api/custom_projection_example.py
===================================================================
--- trunk/matplotlib/examples/api/custom_projection_example.py  2009-05-21 
21:06:49 UTC (rev 7130)
+++ trunk/matplotlib/examples/api/custom_projection_example.py  2009-05-22 
14:00:12 UTC (rev 7131)
@@ -373,15 +373,6 @@
         output_dims = 2
         is_separable = False
 
-        def __init__(self, resolution):
-            """
-            Create a new Hammer transform.  Resolution is the number of steps
-            to interpolate between each input line segment to approximate its
-            path in curved Hammer space.
-            """
-            Transform.__init__(self)
-            self._resolution = resolution
-
         def transform(self, ll):
             """
             Override the transform method to implement the custom transform.
@@ -410,11 +401,11 @@
         # ``transform_path``.
         def transform_path(self, path):
             vertices = path.vertices
-            ipath = path.interpolated(self._resolution)
+            ipath = path.interpolated(path._interpolation_steps)
             return Path(self.transform(ipath.vertices), ipath.codes)
 
         def inverted(self):
-            return HammerAxes.InvertedHammerTransform(self._resolution)
+            return HammerAxes.InvertedHammerTransform()
         inverted.__doc__ = Transform.inverted.__doc__
 
     class InvertedHammerTransform(Transform):
@@ -422,10 +413,6 @@
         output_dims = 2
         is_separable = False
 
-        def __init__(self, resolution):
-            Transform.__init__(self)
-            self._resolution = resolution
-
         def transform(self, xy):
             x = xy[:, 0:1]
             y = xy[:, 1:2]
@@ -440,7 +427,7 @@
 
         def inverted(self):
             # The inverse of the inverse is the original transform... ;)
-            return HammerAxes.HammerTransform(self._resolution)
+            return HammerAxes.HammerTransform()
         inverted.__doc__ = Transform.inverted.__doc__
 
 # Now register the projection with matplotlib so the user can select

Modified: trunk/matplotlib/examples/pylab_examples/polar_bar.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/polar_bar.py       2009-05-21 
21:06:49 UTC (rev 7130)
+++ trunk/matplotlib/examples/pylab_examples/polar_bar.py       2009-05-22 
14:00:12 UTC (rev 7131)
@@ -7,7 +7,7 @@
 
 # force square figure and square axes looks better for polar, IMO
 fig = figure(figsize=(8,8))
-ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True, resolution=50)
+ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True)
 
 N = 20
 theta = np.arange(0.0, 2*np.pi, 2*np.pi/N)

Modified: trunk/matplotlib/lib/matplotlib/axis.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/axis.py     2009-05-21 21:06:49 UTC (rev 
7130)
+++ trunk/matplotlib/lib/matplotlib/axis.py     2009-05-22 14:00:12 UTC (rev 
7131)
@@ -16,6 +16,7 @@
 import matplotlib.transforms as mtransforms
 import matplotlib.units as munits
 
+GRIDLINE_INTERPOLATION_STEPS = 180
 
 class Tick(artist.Artist):
     """
@@ -308,6 +309,7 @@
                    linewidth=rcParams['grid.linewidth'],
                    )
         l.set_transform(self.axes.get_xaxis_transform())
+        l.get_path()._interpolation_steps = GRIDLINE_INTERPOLATION_STEPS
         self._set_artist_props(l)
 
         return l
@@ -437,6 +439,7 @@
                     )
 
         l.set_transform(self.axes.get_yaxis_transform())
+        l.get_path()._interpolation_steps = GRIDLINE_INTERPOLATION_STEPS
         self._set_artist_props(l)
         return l
 

Modified: trunk/matplotlib/lib/matplotlib/cbook.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/cbook.py    2009-05-21 21:06:49 UTC (rev 
7130)
+++ trunk/matplotlib/lib/matplotlib/cbook.py    2009-05-22 14:00:12 UTC (rev 
7131)
@@ -1177,6 +1177,9 @@
 
 
 def simple_linear_interpolation(a, steps):
+    if steps == 1:
+        return a
+
     steps = np.floor(steps)
     new_length = ((len(a) - 1) * steps) + 1
     new_shape = list(a.shape)

Modified: trunk/matplotlib/lib/matplotlib/lines.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/lines.py    2009-05-21 21:06:49 UTC (rev 
7130)
+++ trunk/matplotlib/lib/matplotlib/lines.py    2009-05-22 14:00:12 UTC (rev 
7131)
@@ -443,7 +443,11 @@
         self._subslice = False
         if len(x) > 100 and self._is_sorted(x):
             self._subslice = True
-        self._path = Path(self._xy)
+        if hasattr(self, '_path'):
+            interpolation_steps = self._path._interpolation_steps
+        else:
+            interpolation_steps = 1
+        self._path = Path(self._xy, None, interpolation_steps)
         self._transformed_path = None
         self._invalid = False
 

Modified: trunk/matplotlib/lib/matplotlib/path.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/path.py     2009-05-21 21:06:49 UTC (rev 
7130)
+++ trunk/matplotlib/lib/matplotlib/path.py     2009-05-22 14:00:12 UTC (rev 
7131)
@@ -80,7 +80,7 @@
 
     code_type = np.uint8
 
-    def __init__(self, vertices, codes=None):
+    def __init__(self, vertices, codes=None, _interpolation_steps=1):
         """
         Create a new path with the given vertices and codes.
 
@@ -100,6 +100,11 @@
         to NaNs which are then handled correctly by the Agg
         PathIterator and other consumers of path data, such as
         :meth:`iter_segments`.
+
+        *interpolation_steps* is used as a hint to certain projections,
+        such as Polar, that this path should be linearly interpolated
+        immediately before drawing.  This attribute is primarily an
+        implementation detail and is not intended for public use.
         """
         if ma.isMaskedArray(vertices):
             vertices = vertices.astype(np.float_).filled(np.nan)
@@ -118,12 +123,10 @@
                                 (len(vertices) >= 128 and
                                  (codes is None or np.all(codes <= 
Path.LINETO))))
         self.simplify_threshold = rcParams['path.simplify_threshold']
-        # The following operation takes most of the time in this
-        # initialization, and it does not appear to be used anywhere;
-        # if it is occasionally needed, it could be made a property.
-        #self.has_nonfinite = not np.isfinite(vertices).all()
+        self.has_nonfinite = not np.isfinite(vertices).all()
         self.codes = codes
         self.vertices = vertices
+        self._interpolation_steps = _interpolation_steps
 
     @classmethod
     def make_compound_path(cls, *args):
@@ -224,7 +227,8 @@
                 transformed result and automatically update when the
                 transform changes.
         """
-        return Path(transform.transform(self.vertices), self.codes)
+        return Path(transform.transform(self.vertices), self.codes,
+                    self._interpolation_steps)
 
     def contains_point(self, point, transform=None):
         """
@@ -292,6 +296,9 @@
         Returns a new path resampled to length N x steps.  Does not
         currently handle interpolating curves.
         """
+        if steps == 1:
+            return self
+
         vertices = simple_linear_interpolation(self.vertices, steps)
         codes = self.codes
         if codes is not None:

Modified: trunk/matplotlib/lib/matplotlib/projections/polar.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/projections/polar.py        2009-05-21 
21:06:49 UTC (rev 7130)
+++ trunk/matplotlib/lib/matplotlib/projections/polar.py        2009-05-22 
14:00:12 UTC (rev 7131)
@@ -1,4 +1,5 @@
 import math
+import warnings
 
 import numpy as npy
 
@@ -32,15 +33,6 @@
         output_dims = 2
         is_separable = False
 
-        def __init__(self, resolution):
-            """
-            Create a new polar transform.  Resolution is the number of steps
-            to interpolate between each input line segment to approximate its
-            path in curved polar space.
-            """
-            Transform.__init__(self)
-            self._resolution = resolution
-
         def transform(self, tr):
             xy   = npy.zeros(tr.shape, npy.float_)
             t    = tr[:, 0:1]
@@ -59,7 +51,7 @@
             vertices = path.vertices
             if len(vertices) == 2 and vertices[0, 0] == vertices[1, 0]:
                 return Path(self.transform(vertices), path.codes)
-            ipath = path.interpolated(self._resolution)
+            ipath = path.interpolated(path._interpolation_steps)
             return Path(self.transform(ipath.vertices), ipath.codes)
         transform_path.__doc__ = Transform.transform_path.__doc__
 
@@ -67,7 +59,7 @@
         transform_path_non_affine.__doc__ = 
Transform.transform_path_non_affine.__doc__
 
         def inverted(self):
-            return PolarAxes.InvertedPolarTransform(self._resolution)
+            return PolarAxes.InvertedPolarTransform()
         inverted.__doc__ = Transform.inverted.__doc__
 
     class PolarAffine(Affine2DBase):
@@ -109,10 +101,6 @@
         output_dims = 2
         is_separable = False
 
-        def __init__(self, resolution):
-            Transform.__init__(self)
-            self._resolution = resolution
-
         def transform(self, xy):
             x = xy[:, 0:1]
             y = xy[:, 1:]
@@ -123,7 +111,7 @@
         transform.__doc__ = Transform.transform.__doc__
 
         def inverted(self):
-            return PolarAxes.PolarTransform(self._resolution)
+            return PolarAxes.PolarTransform()
         inverted.__doc__ = Transform.inverted.__doc__
 
     class ThetaFormatter(Formatter):
@@ -177,8 +165,6 @@
             return 0, vmax
 
 
-    RESOLUTION = 1
-
     def __init__(self, *args, **kwargs):
         """
         Create a new Polar Axes for a polar plot.
@@ -192,8 +178,11 @@
 
         self._rpad = 0.05
         self.resolution = kwargs.pop('resolution', None)
-        if self.resolution is None:
-            self.resolution = self.RESOLUTION
+        if self.resolution not in (None, 1):
+            warnings.warn(
+                """The resolution kwarg to Polar plots is now ignored.
+If you need to interpolate data points, consider running
+cbook.simple_linear_interpolation on the data before passing to matplotlib.""")
         Axes.__init__(self, *args, **kwargs)
         self.set_aspect('equal', adjustable='box', anchor='C')
         self.cla()
@@ -221,7 +210,7 @@
         self.transScale = TransformWrapper(IdentityTransform())
 
         # A (possibly non-linear) projection on the (already scaled) data
-        self.transProjection = self.PolarTransform(self.resolution)
+        self.transProjection = self.PolarTransform()
 
         # An affine transformation on the data, generally to limit the
         # range of the axes

Modified: trunk/matplotlib/lib/matplotlib/transforms.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/transforms.py       2009-05-21 21:06:49 UTC 
(rev 7130)
+++ trunk/matplotlib/lib/matplotlib/transforms.py       2009-05-22 14:00:12 UTC 
(rev 7131)
@@ -1119,7 +1119,8 @@
         In some cases, this transform may insert curves into the path
         that began as line segments.
         """
-        return Path(self.transform(path.vertices), path.codes)
+        return Path(self.transform(path.vertices), path.codes,
+                    path._interpolation_steps)
 
     def transform_path_affine(self, path):
         """
@@ -1143,7 +1144,8 @@
         ``transform_path(path)`` is equivalent to
         ``transform_path_affine(transform_path_non_affine(values))``.
         """
-        return Path(self.transform_non_affine(path.vertices), path.codes)
+        return Path(self.transform_non_affine(path.vertices), path.codes,
+                    self._interpolation_steps)
 
     def transform_angles(self, angles, pts, radians=False, pushoff=1e-5):
         """
@@ -2181,7 +2183,8 @@
             self._transformed_path = \
                 self._transform.transform_path_non_affine(self._path)
             self._transformed_points = \
-                Path(self._transform.transform_non_affine(self._path.vertices))
+                Path(self._transform.transform_non_affine(self._path.vertices),
+                     None, self._path._interpolation_steps)
         self._invalid = 0
 
     def get_transformed_points_and_affine(self):


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

------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to