From: <ef...@us...> - 2008-11-13 08:11:20
|
Revision: 6401 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6401&view=rev Author: efiring Date: 2008-11-13 08:11:13 +0000 (Thu, 13 Nov 2008) Log Message: ----------- Fix autoscaling problems associated with axhline etc. Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/artist.py trunk/matplotlib/lib/matplotlib/axes.py trunk/matplotlib/lib/matplotlib/transforms.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2008-11-12 20:09:10 UTC (rev 6400) +++ trunk/matplotlib/CHANGELOG 2008-11-13 08:11:13 UTC (rev 6401) @@ -1,3 +1,9 @@ +2008-11-12 Add x_isdata and y_isdata attributes to Artist instances, + and use them to determine whether either or both + coordinates are used when updating dataLim. This is + used to fix autoscaling problems that had been triggered + by axhline, axhspan, axvline, axvspan. - EF + 2008-11-11 Update the psd(), csd(), cohere(), and specgram() methods of Axes and the csd() cohere(), and specgram() functions in mlab to be in sync with the changes to psd(). Modified: trunk/matplotlib/lib/matplotlib/artist.py =================================================================== --- trunk/matplotlib/lib/matplotlib/artist.py 2008-11-12 20:09:10 UTC (rev 6400) +++ trunk/matplotlib/lib/matplotlib/artist.py 2008-11-13 08:11:13 UTC (rev 6401) @@ -51,6 +51,8 @@ self.axes = None self._remove_method = None self._url = None + self.x_isdata = True # False to avoid updating Axes.dataLim with x + self.y_isdata = True # with y def remove(self): """ @@ -319,7 +321,7 @@ Returns the url """ return self._url - + def set_url(self, url): """ Sets the url for the artist Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2008-11-12 20:09:10 UTC (rev 6400) +++ trunk/matplotlib/lib/matplotlib/axes.py 2008-11-13 08:11:13 UTC (rev 6401) @@ -1312,8 +1312,7 @@ self._set_artist_props(line) line.set_clip_path(self.patch) - if line.get_transform() == self.transData: - self._update_line_limits(line) + self._update_line_limits(line) if not line.get_label(): line.set_label('_line%d'%len(self.lines)) self.lines.append(line) @@ -1322,7 +1321,9 @@ def _update_line_limits(self, line): p = line.get_path() if p.vertices.size > 0: - self.dataLim.update_from_path(p, self.ignore_existing_data_limits) + self.dataLim.update_from_path(p, self.ignore_existing_data_limits, + updatex=line.x_isdata, + updatey=line.y_isdata) self.ignore_existing_data_limits = False def add_patch(self, p): @@ -1356,7 +1357,8 @@ transform = (patch.get_data_transform() + self.transData.inverted()) xys = transform.transform(xys) - self.update_datalim(xys) + self.update_datalim(xys, updatex=patch.x_isdata, + updatey=patch.y_isdata) def add_table(self, tab): @@ -1381,7 +1383,7 @@ for p in self.patches: self._update_patch_limits(p) - def update_datalim(self, xys): + def update_datalim(self, xys, updatex=True, updatey=True): 'Update the data lim bbox with seq of xy tups or equiv. 2-D array' # if no data is set currently, the bbox will ignore its # limits and set the bound to be the bounds of the xydata. @@ -1391,7 +1393,8 @@ if iterable(xys) and not len(xys): return if not ma.isMaskedArray(xys): xys = np.asarray(xys) - self.dataLim.update_from_data_xy(xys, self.ignore_existing_data_limits) + self.dataLim.update_from_data_xy(xys, self.ignore_existing_data_limits, + updatex=updatex, updatey=updatey) self.ignore_existing_data_limits = False def update_datalim_numerix(self, x, y): @@ -2776,11 +2779,9 @@ trans = mtransforms.blended_transform_factory( self.transAxes, self.transData) l = mlines.Line2D([xmin,xmax], [y,y], transform=trans, **kwargs) + l.x_isdata = False self.add_line(l) - self.dataLim.y0 = min(self.dataLim.y0, yy) - self.dataLim.y1 = max(self.dataLim.y1, yy) self.autoscale_view(scalex=False, scaley=scaley) - return l axhline.__doc__ = cbook.dedent(axhline.__doc__) % martist.kwdocd @@ -2836,11 +2837,9 @@ trans = mtransforms.blended_transform_factory( self.transData, self.transAxes) l = mlines.Line2D([x,x], [ymin,ymax] , transform=trans, **kwargs) + l.y_isdata = False self.add_line(l) - self.dataLim.x0 = min(self.dataLim.x0, xx) - self.dataLim.x1 = max(self.dataLim.x1, xx) self.autoscale_view(scalex=scalex, scaley=False) - return l axvline.__doc__ = cbook.dedent(axvline.__doc__) % martist.kwdocd @@ -2858,7 +2857,7 @@ Draw a horizontal span (rectangle) from *ymin* to *ymax*. With the default values of *xmin* = 0 and *xmax* = 1, this - always span the xrange, regardless of the xlim settings, even + always spans the xrange, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command. That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the *y* location is in data @@ -2896,6 +2895,7 @@ verts = (xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin) p = mpatches.Polygon(verts, **kwargs) p.set_transform(trans) + p.x_isdata = False self.add_patch(p) return p axhspan.__doc__ = cbook.dedent(axhspan.__doc__) % martist.kwdocd @@ -2913,7 +2913,7 @@ Draw a vertical span (rectangle) from *xmin* to *xmax*. With the default values of *ymin* = 0 and *ymax* = 1, this always - span the yrange, regardless of the ylim settings, even if you + spans the yrange, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command. That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the *y* location is in data coordinates. @@ -2950,6 +2950,7 @@ verts = [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin)] p = mpatches.Polygon(verts, **kwargs) p.set_transform(trans) + p.y_isdata = False self.add_patch(p) return p axvspan.__doc__ = cbook.dedent(axvspan.__doc__) % martist.kwdocd Modified: trunk/matplotlib/lib/matplotlib/transforms.py =================================================================== --- trunk/matplotlib/lib/matplotlib/transforms.py 2008-11-12 20:09:10 UTC (rev 6400) +++ trunk/matplotlib/lib/matplotlib/transforms.py 2008-11-13 08:11:13 UTC (rev 6401) @@ -776,7 +776,8 @@ def update_from_data(self, x, y, ignore=None): """ Update the bounds of the :class:`Bbox` based on the passed in - data. + data. After updating, the bounds will have positive *width* + and *height*; *x0* and *y0* will be the minimal values. *x*: a numpy array of *x*-values @@ -791,10 +792,11 @@ xy = np.hstack((x.reshape((len(x), 1)), y.reshape((len(y), 1)))) return self.update_from_data_xy(xy, ignore) - def update_from_path(self, path, ignore=None): + def update_from_path(self, path, ignore=None, updatex=True, updatey=True): """ Update the bounds of the :class:`Bbox` based on the passed in - data. + data. After updating, the bounds will have positive *width* + and *height*; *x0* and *y0* will be the minimal values. *path*: a :class:`~matplotlib.path.Path` instance @@ -802,6 +804,10 @@ - when True, ignore the existing bounds of the :class:`Bbox`. - when False, include the existing bounds of the :class:`Bbox`. - when None, use the last value passed to :meth:`ignore`. + + *updatex*: when True, update the x values + + *updatey*: when True, update the y values """ if ignore is None: ignore = self._ignore @@ -813,15 +819,20 @@ path, None, self._points, self._minpos, ignore) if changed: - self._points = points - self._minpos = minpos self.invalidate() + if updatex: + self._points[:,0] = points[:,0] + self._minpos[0] = minpos[0] + if updatey: + self._points[:,1] = points[:,1] + self._minpos[1] = minpos[1] - def update_from_data_xy(self, xy, ignore=None): + def update_from_data_xy(self, xy, ignore=None, updatex=True, updatey=True): """ Update the bounds of the :class:`Bbox` based on the passed in - data. + data. After updating, the bounds will have positive *width* + and *height*; *x0* and *y0* will be the minimal values. *xy*: a numpy array of 2D points @@ -829,12 +840,17 @@ - when True, ignore the existing bounds of the :class:`Bbox`. - when False, include the existing bounds of the :class:`Bbox`. - when None, use the last value passed to :meth:`ignore`. + + *updatex*: when True, update the x values + + *updatey*: when True, update the y values """ if len(xy) == 0: return path = Path(xy) - self.update_from_path(path, ignore=ignore) + self.update_from_path(path, ignore=ignore, + updatex=updatex, updatey=updatey) def _set_x0(self, val): self._points[0, 0] = val This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |