From: <ef...@us...> - 2008-10-24 00:09:02
|
Revision: 6315 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6315&view=rev Author: efiring Date: 2008-10-24 00:08:58 +0000 (Fri, 24 Oct 2008) Log Message: ----------- Support autoscaling with shared axes Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/axes.py trunk/matplotlib/lib/matplotlib/ticker.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2008-10-23 19:56:04 UTC (rev 6314) +++ trunk/matplotlib/CHANGELOG 2008-10-24 00:08:58 UTC (rev 6315) @@ -1,3 +1,5 @@ +2008-10-23 Autoscaling is now supported with shared axes - EF + 2008-10-23 Fixed exception in dviread that happened with Minion - JKS 2008-10-21 set_xlim, ylim now return a copy of the viewlim array to Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2008-10-23 19:56:04 UTC (rev 6314) +++ trunk/matplotlib/lib/matplotlib/axes.py 2008-10-24 00:08:58 UTC (rev 6315) @@ -1451,20 +1451,30 @@ """ # if image data only just use the datalim if not self._autoscaleon: return + if scalex: + xshared = self._shared_x_axes.get_siblings(self) + dl = [ax.dataLim for ax in xshared] + bb = mtransforms.BboxBase.union(dl) + x0, x1 = bb.intervalx + if scaley: + yshared = self._shared_y_axes.get_siblings(self) + dl = [ax.dataLim for ax in yshared] + bb = mtransforms.BboxBase.union(dl) + y0, y1 = bb.intervaly if (tight or (len(self.images)>0 and len(self.lines)==0 and len(self.patches)==0)): - - if scalex: self.set_xbound(self.dataLim.intervalx) - - if scaley: self.set_ybound(self.dataLim.intervaly) + if scalex: + self.set_xbound(x0, x1) + if scaley: + self.set_ybound(y0, 11) return if scalex: - XL = self.xaxis.get_major_locator().autoscale() + XL = self.xaxis.get_major_locator().view_limits(x0, x1) self.set_xbound(XL) if scaley: - YL = self.yaxis.get_major_locator().autoscale() + YL = self.yaxis.get_major_locator().view_limits(y0, y1) self.set_ybound(YL) #### Drawing Modified: trunk/matplotlib/lib/matplotlib/ticker.py =================================================================== --- trunk/matplotlib/lib/matplotlib/ticker.py 2008-10-23 19:56:04 UTC (rev 6314) +++ trunk/matplotlib/lib/matplotlib/ticker.py 2008-10-24 00:08:58 UTC (rev 6315) @@ -641,9 +641,17 @@ 'Return the locations of the ticks' raise NotImplementedError('Derived must override') + def view_limits(self, vmin, vmax): + """ + select a scale for the range from vmin to vmax + + Normally This will be overridden. + """ + return mtransforms.nonsingular(vmin, vmax) + def autoscale(self): 'autoscale the view limits' - return mtransforms.nonsingular(*self.axis.get_view_interval()) + return self.view_limits(*self.axis.get_view_interval()) def pan(self, numsteps): 'Pan numticks (can be positive or negative)' @@ -773,11 +781,9 @@ def _set_numticks(self): self.numticks = 11 # todo; be smart here; this is just for dev - def autoscale(self): + def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' - vmin, vmax = self.axis.get_data_interval() - if vmax<vmin: vmin, vmax = vmax, vmin @@ -859,13 +865,11 @@ locs = vmin + np.arange(n+1) * base return locs - def autoscale(self): + def view_limits(self, dmin, dmax): """ Set the view limits to the nearest multiples of base that contain the data """ - dmin, dmax = self.axis.get_data_interval() - vmin = self._base.le(dmin) vmax = self._base.ge(dmax) if vmin==vmax: @@ -946,8 +950,7 @@ vmin, vmax = mtransforms.nonsingular(vmin, vmax, expander = 0.05) return self.bin_boundaries(vmin, vmax) - def autoscale(self): - dmin, dmax = self.axis.get_data_interval() + def view_limits(self, dmin, dmax): if self._symmetric: maxabs = max(abs(dmin), abs(dmax)) dmin = -maxabs @@ -1043,9 +1046,9 @@ return np.array(ticklocs) - def autoscale(self): + def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' - vmin, vmax = self.axis.get_data_interval() + if vmax<vmin: vmin, vmax = vmax, vmin @@ -1114,10 +1117,9 @@ ticklocs = np.sign(decades) * b ** np.abs(decades) return np.array(ticklocs) - def autoscale(self): + def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' b = self._transform.base - vmin, vmax = self.axis.get_data_interval() if vmax<vmin: vmin, vmax = vmax, vmin @@ -1167,13 +1169,12 @@ d = abs(vmax-vmin) self._locator = self.get_locator(d) - def autoscale(self): + def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' - vmin, vmax = self.axis.get_data_interval() d = abs(vmax-vmin) self._locator = self.get_locator(d) - return self._locator.autoscale() + return self._locator.view_limits(vmin, vmax) def get_locator(self, d): 'pick the best locator based on a distance' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |