From: <ef...@us...> - 2009-08-15 21:24:09
|
Revision: 7494 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7494&view=rev Author: efiring Date: 2009-08-15 21:24:01 +0000 (Sat, 15 Aug 2009) Log Message: ----------- pyplot tracks current image at the figure and axes level; fixes ticket 1656374 Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/boilerplate.py trunk/matplotlib/examples/pylab_examples/multi_image.py trunk/matplotlib/lib/matplotlib/axes.py trunk/matplotlib/lib/matplotlib/cbook.py trunk/matplotlib/lib/matplotlib/figure.py trunk/matplotlib/lib/matplotlib/pyplot.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/CHANGELOG 2009-08-15 21:24:01 UTC (rev 7494) @@ -1,3 +1,6 @@ +2009-08-15 Pyplot interface: the current image is now tracked at the + figure and axes level, addressing tracker item 1656374. - EF + 2009-08-15 Docstrings are now manipulated with decorators defined in a new module, docstring.py, thanks to Jason Coombs. - EF Modified: trunk/matplotlib/boilerplate.py =================================================================== --- trunk/matplotlib/boilerplate.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/boilerplate.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -1,5 +1,5 @@ # Wrap the plot commands defined in axes. The code generated by this -# file is pasted into pylab.py. We did try to do this the smart way, +# file is pasted into pyplot.py. We did try to do this the smart way, # with callable functions and new.function, but could never get the # docstrings right for python2.2. See # http://groups.google.com/group/comp.lang.python/browse_frm/thread/dcd63ec13096a0f6/1b14640f3a4ad3dc?#1b14640f3a4ad3dc @@ -13,7 +13,7 @@ import types # import the local copy of matplotlib, not the installed one -sys.path.insert(0, './lib') +#sys.path.insert(0, './lib') from matplotlib.axes import Axes from matplotlib.cbook import dedent @@ -104,16 +104,16 @@ ) cmappable = { - 'contour' : 'if %(ret)s._A is not None: gci._current = %(ret)s', - 'contourf': 'if %(ret)s._A is not None: gci._current = %(ret)s', - 'hexbin' : 'gci._current = %(ret)s', - 'scatter' : 'gci._current = %(ret)s', - 'pcolor' : 'gci._current = %(ret)s', - 'pcolormesh' : 'gci._current = %(ret)s', - 'imshow' : 'gci._current = %(ret)s', - 'spy' : 'gci._current = %(ret)s', - 'quiver' : 'gci._current = %(ret)s', - 'specgram' : 'gci._current = %(ret)s[-1]', + 'contour' : 'if %(ret)s._A is not None: sci(%(ret)s)', + 'contourf': 'if %(ret)s._A is not None: sci(%(ret)s)', + 'hexbin' : 'sci(%(ret)s)', + 'scatter' : 'sci(%(ret)s)', + 'pcolor' : 'sci(%(ret)s)', + 'pcolormesh': 'sci(%(ret)s)', + 'imshow' : 'sci(%(ret)s)', + 'spy' : 'sci(%(ret)s)', + 'quiver' : 'sci(%(ret)s)', + 'specgram' : 'sci(%(ret)s[-1])', } @@ -233,3 +233,4 @@ # add all the colormaps (autumn, hsv, ....) for name in cmaps: print _fmtcmap%locals() + Modified: trunk/matplotlib/examples/pylab_examples/multi_image.py =================================================================== --- trunk/matplotlib/examples/pylab_examples/multi_image.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/examples/pylab_examples/multi_image.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -5,7 +5,7 @@ It also illustrates colorbar tick labelling with a multiplier. ''' -from matplotlib.pyplot import figure, show, sci +from matplotlib.pyplot import figure, show, axes, sci from matplotlib import cm, colors from matplotlib.font_manager import FontProperties from numpy import amin, amax, ravel @@ -68,9 +68,11 @@ # The colorbar is also based on this master image. fig.colorbar(images[0], cax, orientation='horizontal') -# We need the following only if we want to run this +# We need the following only if we want to run this interactively and +# modify the colormap: -sci(images[0]) +axes(ax[0]) # Return the current axes to the first one, +sci(images[0]) # because the current image must be in current axes. show() Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/lib/matplotlib/axes.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -838,6 +838,7 @@ self.tables = [] self.artists = [] self.images = [] + self._current_image = None # strictly for pyplot via _sci, _gci self.legend_ = None self.collections = [] # collection.Collection instances @@ -1309,6 +1310,27 @@ #### Adding and tracking artists + def _sci(self, im): + """ + helper for :func:`~matplotlib.pyplot.sci`; + do not use elsewhere. + """ + if isinstance(im, matplotlib.contour.ContourSet): + if im.collections[0] not in self.collections: + raise ValueError( + "ContourSet must be in current Axes") + elif im not in self.images and im not in self.collections: + raise ValueError( + "Argument must be an image, collection, or ContourSet in this Axes") + self._current_image = im + + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + return self._current_image + def has_data(self): '''Return *True* if any artists have been added to axes. Modified: trunk/matplotlib/lib/matplotlib/cbook.py =================================================================== --- trunk/matplotlib/lib/matplotlib/cbook.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/lib/matplotlib/cbook.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -1007,7 +1007,7 @@ -class Stack: +class Stack(object): """ Implement a stack where elements can be pushed on and you can move back and forth. But no pop. Should mimic home / back / forward @@ -1023,6 +1023,12 @@ if not len(self._elements): return self._default else: return self._elements[self._pos] + def __len__(self): + return self._elements.__len__() + + def __getitem__(self, ind): + return self._elements.__getitem__(ind) + def forward(self): 'move the position forward and return the current element' N = len(self._elements) Modified: trunk/matplotlib/lib/matplotlib/figure.py =================================================================== --- trunk/matplotlib/lib/matplotlib/figure.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/lib/matplotlib/figure.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -950,6 +950,17 @@ for func in self._axobservers: func(self) return a + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + for ax in reversed(self._axstack): + im = ax._gci() + if im is not None: + return im + return None + def add_axobserver(self, func): 'whenever the axes state change, func(self) will be called' self._axobservers.append(func) @@ -1039,7 +1050,7 @@ def colorbar(self, mappable, cax=None, ax=None, **kw): """ Create a colorbar for a ScalarMappable instance. - + Documentation for the pylab thin wrapper: %(colorbar_doc)s """ Modified: trunk/matplotlib/lib/matplotlib/pyplot.py =================================================================== --- trunk/matplotlib/lib/matplotlib/pyplot.py 2009-08-15 20:00:09 UTC (rev 7493) +++ trunk/matplotlib/lib/matplotlib/pyplot.py 2009-08-15 21:24:01 UTC (rev 7494) @@ -129,8 +129,10 @@ matplotlib.rcdefaults() draw_if_interactive() -# The current "image" (ScalarMappable) is tracked here on a -# per-pylab-session basis: +# The current "image" (ScalarMappable) is retrieved or set +# only via the pyplot interface using the following two +# functions: + def gci(): """ Get the current :class:`~matplotlib.cm.ScalarMappable` instance @@ -142,18 +144,20 @@ :func:`~matplotlib.pyplot.pcolor` and :func:`~matplotlib.pyplot.scatter` create :class:`~matplotlib.collections.Collection` instances. + The current image is an attribute of the current axes, or the + nearest earlier axes in the current figure that contains an + image. """ - return gci._current -gci._current = None + return gcf()._gci() - def sci(im): """ Set the current image (target of colormap commands like :func:`~matplotlib.pyplot.jet`, :func:`~matplotlib.pyplot.hot` or - :func:`~matplotlib.pyplot.clim`). + :func:`~matplotlib.pyplot.clim`). The current image is an + attribute of the current axes. """ - gci._current = im + gca()._sci(im) ## Any Artist ## @@ -1598,7 +1602,6 @@ ## Plotting part 2: autogenerated wrappers for axes methods ## - # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @autogen_docstring(Axes.acorr) @@ -1830,7 +1833,7 @@ draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -1848,7 +1851,7 @@ draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -1956,7 +1959,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2010,7 +2013,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2046,7 +2049,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2064,7 +2067,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2154,7 +2157,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2190,7 +2193,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2244,7 +2247,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret[-1] + sci(ret[-1]) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2262,7 +2265,7 @@ draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2628,3 +2631,5 @@ draw_if_interactive() + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |