Revision: 8111
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8111&view=rev
Author:   efiring
Date:     2010-02-06 21:24:21 +0000 (Sat, 06 Feb 2010)

Log Message:
-----------
Modified EllipseCollection for closer compatibility with Ellipse patch.

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/doc/api/api_changes.rst
    trunk/matplotlib/lib/matplotlib/collections.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2010-02-04 04:58:51 UTC (rev 8110)
+++ trunk/matplotlib/CHANGELOG  2010-02-06 21:24:21 UTC (rev 8111)
@@ -1,3 +1,5 @@
+2010-02-06 Added 'xy' scaling option to EllipseCollection. - EF
+
 2010-02-03 Made plot_directive use a custom PlotWarning category, so that
            warnings can be turned into fatal errors easily if desired. - FP
 

Modified: trunk/matplotlib/doc/api/api_changes.rst
===================================================================
--- trunk/matplotlib/doc/api/api_changes.rst    2010-02-04 04:58:51 UTC (rev 
8110)
+++ trunk/matplotlib/doc/api/api_changes.rst    2010-02-06 21:24:21 UTC (rev 
8111)
@@ -10,6 +10,19 @@
 Changes beyond 0.99.x
 =====================
 
+* The :class:'~matplotlib.collections.EllipseCollection' has been
+  changed in two ways:
+
+  + There is a new *units* option, 'xy', that scales the ellipse with
+    the data units.  This matches the :class:'~matplotlib.patches.Ellipse`
+    scaling.
+
+  + The *height* and *width* kwargs have been changed to specify
+    the height and width, again for consistency with
+    :class:'~matplotlib.patches.Ellipse`, and to better match
+    their names; previously they specified the half-height and
+    half-width.
+
 * There is a new rc parameter ``axes.color_cycle``, and the color
   cycle is now independent of the rc parameter ``lines.color``.
   :func:`matplotlib.Axes.set_default_color_cycle` is deprecated.

Modified: trunk/matplotlib/lib/matplotlib/collections.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/collections.py      2010-02-04 04:58:51 UTC 
(rev 8110)
+++ trunk/matplotlib/lib/matplotlib/collections.py      2010-02-06 21:24:21 UTC 
(rev 8111)
@@ -918,77 +918,79 @@
     def __init__(self, widths, heights, angles, units='points', **kwargs):
         """
         *widths*: sequence
-            half-lengths of first axes (e.g., semi-major axis lengths)
+            lengths of first axes (e.g., major axis lengths)
 
         *heights*: sequence
-            half-lengths of second axes
+            lengths of second axes
 
         *angles*: sequence
             angles of first axes, degrees CCW from the X-axis
 
-        *units*: ['points' | 'inches' | 'dots' | 'width' | 'height' | 'x' | 
'y']
+        *units*: ['points' | 'inches' | 'dots' | 'width' | 'height'
+                        | 'x' | 'y' | 'xy']
             units in which majors and minors are given; 'width' and 'height'
             refer to the dimensions of the axes, while 'x' and 'y'
-            refer to the *offsets* data units.
+            refer to the *offsets* data units. 'xy' differs from all
+            others in that the angle as plotted varies with the
+            aspect ratio, and equals the specified angle only when
+            the aspect ratio is unity.  Hence it behaves the same
+            as the :class:`~matplotlib.patches.Ellipse` with
+            axes.transData as its transform.
 
         Additional kwargs inherited from the base :class:`Collection`:
 
         %(Collection)s
         """
         Collection.__init__(self,**kwargs)
-        self._widths = np.asarray(widths).ravel()
-        self._heights = np.asarray(heights).ravel()
+        self._widths = 0.5 * np.asarray(widths).ravel()
+        self._heights = 0.5 * np.asarray(heights).ravel()
         self._angles = np.asarray(angles).ravel() *(np.pi/180.0)
         self._units = units
         self.set_transform(transforms.IdentityTransform())
         self._transforms = []
         self._paths = [mpath.Path.unit_circle()]
-        self._initialized = False
 
-
-    def _init(self):
-        def on_dpi_change(fig):
-            self._transforms = []
-        self.figure.callbacks.connect('dpi_changed', on_dpi_change)
-        self._initialized = True
-
-    def set_transforms(self):
-        if not self._initialized:
-            self._init()
+    def _set_transforms(self):
+        """
+        Calculate transforms immediately before drawing.
+        """
         self._transforms = []
         ax = self.axes
         fig = self.figure
-        if self._units in ('x', 'y'):
-            if self._units == 'x':
-                dx0 = ax.viewLim.width
-                dx1 = ax.bbox.width
-            else:
-                dx0 = ax.viewLim.height
-                dx1 = ax.bbox.height
-            sc = dx1/dx0
+
+        if self._units == 'xy':
+            sc = 1
+        elif self._units == 'x':
+            sc = ax.bbox.width / ax.viewLim.width
+        elif self._units == 'y':
+            sc = ax.bbox.height / ax.viewLim.height
+        elif self._units == 'inches':
+            sc = fig.dpi
+        elif self._units == 'points':
+            sc = fig.dpi / 72.0
+        elif self._units == 'width':
+            sc = ax.bbox.width
+        elif self._units == 'height':
+            sc = ax.bbox.height
+        elif self._units == 'dots':
+            sc = 1.0
         else:
-            if self._units == 'inches':
-                sc = fig.dpi
-            elif self._units == 'points':
-                sc = fig.dpi / 72.0
-            elif self._units == 'width':
-                sc = ax.bbox.width
-            elif self._units == 'height':
-                sc = ax.bbox.height
-            elif self._units == 'dots':
-                sc = 1.0
-            else:
-                raise ValueError('unrecognized units: %s' % self._units)
+            raise ValueError('unrecognized units: %s' % self._units)
 
         _affine = transforms.Affine2D
         for x, y, a in zip(self._widths, self._heights, self._angles):
             trans = _affine().scale(x * sc, y * sc).rotate(a)
             self._transforms.append(trans)
 
+        if self._units == 'xy':
+            m = ax.transData.get_affine().get_matrix().copy()
+            m[:2, 2:] = 0
+            self.set_transform(_affine(m))
+
+
     def draw(self, renderer):
-        if True: ###not self._transforms:
-            self.set_transforms()
-        return Collection.draw(self, renderer)
+        self._set_transforms()
+        Collection.draw(self, renderer)
 
 class PatchCollection(Collection):
     """


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

------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to