From: <ef...@us...> - 2008-09-18 17:30:56
|
Revision: 6113 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6113&view=rev Author: efiring Date: 2008-09-19 00:30:54 +0000 (Fri, 19 Sep 2008) Log Message: ----------- Added an EllipseCollection class to collections.py Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/collections.py Added Paths: ----------- trunk/matplotlib/examples/pylab_examples/ellipse_collection.py Added: trunk/matplotlib/examples/pylab_examples/ellipse_collection.py =================================================================== --- trunk/matplotlib/examples/pylab_examples/ellipse_collection.py (rev 0) +++ trunk/matplotlib/examples/pylab_examples/ellipse_collection.py 2008-09-19 00:30:54 UTC (rev 6113) @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.collections import EllipseCollection + +x = np.arange(10) +y = np.arange(15) +X, Y = np.meshgrid(x, y) + +XY = np.hstack((X.ravel()[:,np.newaxis], Y.ravel()[:,np.newaxis])) + +ww = X/10.0 +hh = Y/15.0 +aa = X*9 + + +ax = plt.subplot(1,1,1) + +ec = EllipseCollection( + ww, + hh, + aa, + units='x', + offsets=XY, + transOffset=ax.transData) +ec.set_array((X+Y).ravel()) +ax.add_collection(ec) +ax.autoscale_view() +ax.set_xlabel('X') +ax.set_ylabel('y') +cbar = plt.colorbar(ec) +cbar.set_label('X+Y') +plt.show() + + Modified: trunk/matplotlib/lib/matplotlib/collections.py =================================================================== --- trunk/matplotlib/lib/matplotlib/collections.py 2008-09-18 23:36:43 UTC (rev 6112) +++ trunk/matplotlib/lib/matplotlib/collections.py 2008-09-19 00:30:54 UTC (rev 6113) @@ -10,7 +10,7 @@ """ import copy, math, warnings import numpy as np -import numpy.ma as ma +from numpy import ma import matplotlib as mpl import matplotlib.cbook as cbook import matplotlib.colors as _colors # avoid conflict with kwarg @@ -878,7 +878,7 @@ """ A collection of circles, drawn using splines. """ - def __init__(self, sizes): + def __init__(self, sizes, **kwargs): """ *sizes* Gives the area of the circle in points^2 @@ -900,7 +900,93 @@ for x in self._sizes] return Collection.draw(self, renderer) + def get_paths(self): + return self._paths +class EllipseCollection(Collection): + """ + A collection of ellipses, drawn using splines. + """ + def __init__(self, widths, heights, angles, units='points', **kwargs): + """ + *widths*: sequence + half-lengths of first axes (e.g., semi-major axis lengths) + + *heights*: sequence + half-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 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. + + 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._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 + + + __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd + + 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() + 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 + 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) + + _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) + + def draw(self, renderer): + if True: ###not self._transforms: + self.set_transforms() + return Collection.draw(self, renderer) + + def get_paths(self): + return self._paths + class PatchCollection(Collection): """ A generic collection of patches. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |