From: <md...@us...> - 2007-10-05 19:37:21
|
Revision: 3925 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3925&view=rev Author: mdboom Date: 2007-10-05 12:37:18 -0700 (Fri, 05 Oct 2007) Log Message: ----------- Merged revisions 3909-3924 via svnmerge from http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib ........ r3910 | jrevans | 2007-10-03 18:23:48 -0400 (Wed, 03 Oct 2007) | 4 lines Moved a couple of routines from the Agg version of the FigureCanvas to the base qt version where they belong. Added a couple of overloaded qt methods that should be there and reduce having to inherit when embedding in another QWidget. ........ r3911 | jrevans | 2007-10-03 19:05:30 -0400 (Wed, 03 Oct 2007) | 3 lines Removed an erroneous print statment in backend_qt.py. Added a feature to keep track of axes inversions. ........ r3916 | sameerd | 2007-10-04 17:39:07 -0400 (Thu, 04 Oct 2007) | 3 lines Fix for "NameError: global name 'ones' is not defined" ........ r3917 | jrevans | 2007-10-04 18:13:18 -0400 (Thu, 04 Oct 2007) | 5 lines axes.py: Reverted get/set xlim/ylim methods to original state Added get/set xbound/ybound to handle axes inversion maintenance Removed inverted axes flags patches.py: Added some logic to xform an Ellipse angle as per the Ellipse's transformation. ........ r3918 | efiring | 2007-10-05 02:18:25 -0400 (Fri, 05 Oct 2007) | 2 lines Minor cleanup of arguments and docstring in contour ........ r3919 | efiring | 2007-10-05 02:58:15 -0400 (Fri, 05 Oct 2007) | 2 lines Tweaked automatic contour level calculation ........ r3920 | jrevans | 2007-10-05 12:29:17 -0400 (Fri, 05 Oct 2007) | 2 lines Fixed a typo in the Ellipse code that was causing the ellipse angle to go in the wrong direction. When I was testing I had forgotten to turn off the axes inversion test. ........ r3921 | jrevans | 2007-10-05 13:01:36 -0400 (Fri, 05 Oct 2007) | 2 lines Fixed an error in calculating the mid-point of a bar since the values are now lists and not arrays, they need to be iterated to perform the arithmetic. ........ r3923 | dsdale | 2007-10-05 14:56:10 -0400 (Fri, 05 Oct 2007) | 1 line remove generator expressions from texmanager and mpltraits ........ Modified Paths: -------------- branches/transforms/CHANGELOG branches/transforms/examples/simple_plot.py branches/transforms/lib/matplotlib/axes.py branches/transforms/lib/matplotlib/config/mpltraits.py branches/transforms/lib/matplotlib/contour.py branches/transforms/lib/matplotlib/texmanager.py branches/transforms/lib/matplotlib/ticker.py Property Changed: ---------------- branches/transforms/ Property changes on: branches/transforms ___________________________________________________________________ Name: svnmerge-integrated - /trunk/matplotlib:1-3908 + /trunk/matplotlib:1-3924 Modified: branches/transforms/CHANGELOG =================================================================== --- branches/transforms/CHANGELOG 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/CHANGELOG 2007-10-05 19:37:18 UTC (rev 3925) @@ -1,3 +1,6 @@ +2007-10-05 remove generator expressions from texmanager and mpltraits. + generator expressions are not supported by python-2.3 - DSD + 2007-10-01 Made matplotlib.use() raise an exception if called after backends has been imported. Modified: branches/transforms/examples/simple_plot.py =================================================================== --- branches/transforms/examples/simple_plot.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/examples/simple_plot.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -17,4 +17,6 @@ #savefig('simple_plot.png') savefig('simple_plot') +axes().set_xlim(5, -5) + show() Modified: branches/transforms/lib/matplotlib/axes.py =================================================================== --- branches/transforms/lib/matplotlib/axes.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/lib/matplotlib/axes.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -844,9 +844,9 @@ return - xmin,xmax = self.get_xlim() + xmin,xmax = self.get_xbound() xsize = max(math.fabs(xmax-xmin), 1e-30) - ymin,ymax = self.get_ylim() + ymin,ymax = self.get_ybound() ysize = max(math.fabs(ymax-ymin), 1e-30) l,b,w,h = self.get_position(original=True).bounds @@ -895,14 +895,14 @@ yc = 0.5*(ymin+ymax) y0 = yc - Ysize/2.0 y1 = yc + Ysize/2.0 - self.set_ylim((y0, y1)) + self.set_ybound((y0, y1)) #print 'New y0, y1:', y0, y1 #print 'New ysize, ysize/xsize', y1-y0, (y1-y0)/xsize else: xc = 0.5*(xmin+xmax) x0 = xc - Xsize/2.0 x1 = xc + Xsize/2.0 - self.set_xlim((x0, x1)) + self.set_xbound((x0, x1)) #print 'New x0, x1:', x0, x1 #print 'New xsize, ysize/xsize', x1-x0, ysize/(x1-x0) @@ -1186,24 +1186,20 @@ len(self.lines)==0 and len(self.patches)==0)): - if scalex: self.set_xlim(self.dataLim.intervalx().get_bounds()) + if scalex: self.set_xbound(self.dataLim.intervalx().get_bounds()) - if scaley: self.set_ylim(self.dataLim.intervaly().get_bounds()) + if scaley: self.set_ybound(self.dataLim.intervaly().get_bounds()) return if scalex: - xl = self.get_xlim() + xl = self.get_xbound() XL = self.xaxis.get_major_locator().autoscale() - if xl[1] < xl[0]: - XL = XL[::-1] - self.set_xlim(XL) + self.set_xbound(XL) if scaley: ylocator = self.yaxis.get_major_locator() - yl = self.get_ylim() + yl = self.get_ybound() YL = ylocator.autoscale() - if yl[1] < yl[0]: - YL = YL[::-1] - self.set_ylim(YL) + self.set_ybound(YL) #### Drawing def draw(self, renderer=None, inframe=False): @@ -1427,14 +1423,47 @@ ### data limits, ticks, tick labels, and formatting - def invert_xaxis(self, invert=True): - "Invert the x-axis if 'invert' is True." - self._invertedx = invert + def invert_xaxis(self): + "Invert the x-axis." + left, right = self.get_xlim() + self.set_xlim(right, left) def xaxis_inverted(self): 'Returns True if the x-axis is inverted.' - return self._invertedx + left, right = self.get_xlim() + return right < left + def get_xbound(self): + "Returns the x-axis numerical bounds in the form of lowerBound < upperBound" + left, right = self.get_xlim() + if left < right: + return left, right + else: + return right, left + + def set_xbound(self, lower=None, upper=None): + """Set the lower and upper numerical bounds of the x-axis. + This method will honor axes inversion regardless of parameter order. + """ + if upper is None and iterable(lower): + lower,upper = lower + + old_lower,old_upper = self.get_xbound() + + if lower is None: lower = old_lower + if upper is None: upper = old_upper + + if self.xaxis_inverted(): + if lower < upper: + self.set_xlim(upper, lower) + else: + self.set_xlim(lower, upper) + else: + if lower < upper: + self.set_xlim(lower, upper) + else: + self.set_xlim(upper, lower) + def get_xlim(self): """Get the x-axis range [xmin, xmax] @@ -1483,21 +1512,9 @@ if xmin is None: xmin = old_xmin if xmax is None: xmax = old_xmax - # provided for backwards compatability - if ( xmax < xmin ): - # swap the values so that xmin < xmax and set inverted flag - tmp = xmin - xmin = xmax - xmax = tmp - self.invert_xaxis( True ) - - if ( self._invertedx ): - xmax, xmin = mtransforms.nonsingular(xmax, xmin, increasing=False) - self.viewLim.intervalx = (xmax, xmin) - else: - xmin, xmax = mtransforms.nonsingular(xmin, xmax, increasing=False) - self.viewLim.intervalx = (xmin, xmax) - + xmax, xmin = mtransforms.nonsingular(xmax, xmin, increasing=False) + self.viewLim.intervalx = (xmin, xmax) + if emit: self.callbacks.process('xlim_changed', self) # Call all of the other x-axes that are shared with this one @@ -1566,14 +1583,47 @@ return self.xaxis.set_ticklabels(labels, fontdict, **kwargs) set_xticklabels.__doc__ = cbook.dedent(set_xticklabels.__doc__) % martist.kwdocd - def invert_yaxis(self, invert=True): - "Invert the y-axis if 'invert' is True." - self._invertedy = invert + def invert_yaxis(self): + "Invert the y-axis." + left, right = self.get_ylim() + self.set_ylim(right, left) def yaxis_inverted(self): 'Returns True if the y-axis is inverted.' - return self._invertedy + left, right = self.get_ylim() + return right < left + def get_ybound(self): + "Returns the y-axis numerical bounds in the form of lowerBound < upperBound" + left, right = self.get_ylim() + if left < right: + return left, right + else: + return right, left + + def set_ybound(self, lower=None, upper=None): + """Set the lower and upper numerical bounds of the y-axis. + This method will honor axes inversion regardless of parameter order. + """ + if upper is None and iterable(lower): + lower,upper = lower + + old_lower,old_upper = self.get_ybound() + + if lower is None: lower = old_lower + if upper is None: upper = old_upper + + if self.yaxis_inverted(): + if lower < upper: + self.set_ylim(upper, lower) + else: + self.set_ylim(lower, upper) + else: + if lower < upper: + self.set_ylim(lower, upper) + else: + self.set_ylim(upper, lower) + def get_ylim(self): """Get the y-axis range [xmin, xmax] @@ -1620,21 +1670,9 @@ if ymin is None: ymin = old_ymin if ymax is None: ymax = old_ymax - # provided for backwards compatability - if ( ymax < ymin ): - # swap the values so that ymin < ymax and set inverted flag - tmp = ymin - ymin = ymax - ymax = tmp - self.invert_yaxis( True ) + ymin, ymax = mtransforms.nonsingular(ymin, ymax, increasing=False) + self.viewLim.intervaly = (ymin, ymax) - if ( self._invertedy ): - ymax, ymin = mtransforms.nonsingular(ymax, ymin, increasing=False) - self.viewLim.intervaly = (ymax, ymin) - else: - ymin, ymax = mtransforms.nonsingular(ymin, ymax, increasing=False) - self.viewLim.intervaly = (ymin, ymax) - if emit: self.callbacks.process('ylim_changed', self) # Call all of the other y-axes that are shared with this one @@ -2357,9 +2395,9 @@ y = npy.asarray(y) if len(xmin)==1: - xmin = xmin*ones(y.shape, y.dtype) + xmin = xmin*npy.ones(y.shape, y.dtype) if len(xmax)==1: - xmax = xmax*ones(y.shape, y.dtype) + xmax = xmax*npy.ones(y.shape, y.dtype) xmin = npy.asarray(xmin) xmax = npy.asarray(xmax) @@ -3199,9 +3237,9 @@ pass elif align == 'center': if orientation == 'vertical': - left = left - width/2. + left = [left[i] - width[i]/2. for i in range(len(left))] elif orientation == 'horizontal': - bottom = bottom-height/2. + bottom = [bottom[i] - height[i]/2. for i in range(len(bottom))] else: raise ValueError, 'invalid alignment: %s' % align Modified: branches/transforms/lib/matplotlib/config/mpltraits.py =================================================================== --- branches/transforms/lib/matplotlib/config/mpltraits.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/lib/matplotlib/config/mpltraits.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -46,7 +46,7 @@ def info(self): be = self.backends.keys() be.sort - return "one of %s"% ', '.join('%s'%i for i in be) + return "one of %s"% ', '.join(['%s'%i for i in be]) class BoolHandler(T.TraitHandler): @@ -73,7 +73,7 @@ return self.error(object, name, value) def info(self): - return "one of %s"% ', '.join('%s'%i for i in self.bools.keys()) + return "one of %s"% ', '.join(['%s'%i for i in self.bools.keys()]) flexible_true = T.Trait(True, BoolHandler()) flexible_false = T.Trait(False, BoolHandler()) Modified: branches/transforms/lib/matplotlib/contour.py =================================================================== --- branches/transforms/lib/matplotlib/contour.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/lib/matplotlib/contour.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -397,12 +397,7 @@ cmap = kwargs.get('cmap', None) self.colors = kwargs.get('colors', None) norm = kwargs.get('norm', None) - self.clip_ends = kwargs.get('clip_ends', None) ######## self.extend = kwargs.get('extend', 'neither') - if self.clip_ends is not None: - warnings.warn("'clip_ends' has been replaced by 'extend'") - self.levels = self.levels[1:-1] # discard specified end levels - self.extend = 'both' # regenerate end levels self.antialiased = kwargs.get('antialiased', True) self.nchunk = kwargs.get('nchunk', 0) self.locator = kwargs.get('locator', None) @@ -436,10 +431,8 @@ _mask = None if self.filled: - if self.linewidths is None: - self.linewidths = 0.05 # Good default for Postscript. - if cbook.iterable(self.linewidths): - self.linewidths = self.linewidths[0] + if self.linewidths is not None: + warnings.warn('linewidths is ignored by contourf') C = _cntr.Cntr(x, y, z.filled(), _mask) lowers = self._levels[:-1] uppers = self._levels[1:] @@ -447,7 +440,6 @@ nlist = C.trace(level, level_upper, points = 0, nchunk = self.nchunk) col = collections.PolyCollection(nlist, - linewidths = (self.linewidths,), antialiaseds = (self.antialiased,), edgecolors= 'None') self.ax.add_collection(col) @@ -500,16 +492,18 @@ one contour line, but two filled regions, and therefore three levels to provide boundaries for both regions. ''' - zmax = self.zmax - zmin = self.zmin - zmargin = (zmax - zmin) * 0.001 # so z < (zmax + zmargin) - zmax = zmax + zmargin - intv = transforms.Interval(transforms.Value(zmin), transforms.Value(zmax)) if self.locator is None: self.locator = ticker.MaxNLocator(N+1) - self.locator.set_view_interval(intv) - self.locator.set_data_interval(intv) - lev = self.locator() + locator = self.locator + zmax = self.zmax + zmin = self.zmin + locator.set_bounds(zmin, zmax) + lev = locator() + zmargin = (zmax - zmin) * 0.000001 # so z < (zmax + zmargin) + if zmax >= lev[-1]: + lev[-1] += zmargin + if zmin <= lev[0]: + lev[0] -= zmargin self._auto = True if self.filled: return lev @@ -627,16 +621,16 @@ self._levels = npy.asarray(self._levels) self.vmin = npy.amin(self.levels) # alternative would be self.layers self.vmax = npy.amax(self.levels) - if self.extend in ('both', 'min') or self.clip_ends: + if self.extend in ('both', 'min'): self.vmin = 2 * self.levels[0] - self.levels[1] - if self.extend in ('both', 'max') or self.clip_ends: + if self.extend in ('both', 'max'): self.vmax = 2 * self.levels[-1] - self.levels[-2] self.layers = self._levels # contour: a line is a thin layer if self.filled: self.layers = 0.5 * (self._levels[:-1] + self._levels[1:]) - if self.extend in ('both', 'min') or self.clip_ends: + if self.extend in ('both', 'min'): self.layers[0] = 0.5 * (self.vmin + self._levels[1]) - if self.extend in ('both', 'max') or self.clip_ends: + if self.extend in ('both', 'max'): self.layers[-1] = 0.5 * (self.vmax + self._levels[-2]) return (x, y, z) @@ -774,7 +768,6 @@ contour levels if they are not given explicitly via the V argument. - ***** New: ***** * extend = 'neither', 'both', 'min', 'max' Unless this is 'neither' (default), contour levels are automatically added to one or both ends of the range so that @@ -782,8 +775,7 @@ mapped to the special colormap values which default to the ends of the colormap range, but can be set via Colormap.set_under() and Colormap.set_over() methods. - To replace clip_ends=True and V = [-100, 2, 1, 0, 1, 2, 100], - use extend='both' and V = [2, 1, 0, 1, 2]. + **************** contour only: @@ -799,29 +791,13 @@ matplotlibrc is used contourf only: - ***** Obsolete: **** - * clip_ends = True - If False, the limits for color scaling are set to the - minimum and maximum contour levels. - True (default) clips the scaling limits. Example: - if the contour boundaries are V = [-100, 2, 1, 0, 1, 2, 100], - then the scaling limits will be [-100, 100] if clip_ends - is False, and [-3, 3] if clip_ends is True. - * linewidths = None or a number; default of 0.05 works for - Postscript; a value of about 0.5 seems better for Agg. - * antialiased = True (default) or False; if False, there is - no need to increase the linewidths for Agg, but True gives - nicer color boundaries. If antialiased is True and linewidths - is too small, then there may be light-colored lines at the - color boundaries caused by the antialiasing. + * antialiased = True (default) or False * nchunk = 0 (default) for no subdivision of the domain; specify a positive integer to divide the domain into subdomains of roughly nchunk by nchunk points. This may never actually be advantageous, so this option may be removed. Chunking introduces artifacts at the chunk - boundaries unless antialiased = False, or linewidths is - set to a large enough value for the particular renderer and - resolution. + boundaries unless antialiased = False """ Modified: branches/transforms/lib/matplotlib/texmanager.py =================================================================== --- branches/transforms/lib/matplotlib/texmanager.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/lib/matplotlib/texmanager.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -110,7 +110,7 @@ _rc_cache = None _rc_cache_keys = ('text.latex.preamble', )\ - + tuple('font.'+n for n in ('family', ) + font_families) + + tuple(['font.'+n for n in ('family', ) + font_families]) def __init__(self): @@ -125,7 +125,7 @@ fontconfig = [self.font_family] for font_family, font_family_attr in \ - ((ff, ff.replace('-', '_')) for ff in self.font_families): + [(ff, ff.replace('-', '_')) for ff in self.font_families]: for font in rcParams['font.'+font_family]: if font.lower() in self.font_info: found_font = self.font_info[font.lower()] @@ -163,7 +163,7 @@ def get_font_config(self): "Reinitializes self if rcParams self depends on have changed." if self._rc_cache is None: - self._rc_cache = dict((k,None) for k in self._rc_cache_keys) + self._rc_cache = dict([(k,None) for k in self._rc_cache_keys]) changed = [par for par in self._rc_cache_keys if rcParams[par] != \ self._rc_cache[par]] if changed: Modified: branches/transforms/lib/matplotlib/ticker.py =================================================================== --- branches/transforms/lib/matplotlib/ticker.py 2007-10-05 19:25:33 UTC (rev 3924) +++ branches/transforms/lib/matplotlib/ticker.py 2007-10-05 19:37:18 UTC (rev 3925) @@ -370,7 +370,7 @@ self.format = '$%s$' % self.format elif self._useMathText: self.format = '$\mathdefault{%s}$' % self.format - + def pprint_val(self, x): xp = (x-self.offset)/10**self.orderOfMagnitude if npy.absolute(xp) < 1e-8: xp = 0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |