From: <ef...@us...> - 2010-04-19 01:14:01
|
Revision: 8242 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8242&view=rev Author: efiring Date: 2010-04-19 01:13:54 +0000 (Mon, 19 Apr 2010) Log Message: ----------- Tame that obscure MaxNLocator: change parameters after instantiation. Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/boilerplate.py trunk/matplotlib/lib/matplotlib/axes.py trunk/matplotlib/lib/matplotlib/pyplot.py trunk/matplotlib/lib/matplotlib/ticker.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2010-04-18 23:11:24 UTC (rev 8241) +++ trunk/matplotlib/CHANGELOG 2010-04-19 01:13:54 UTC (rev 8242) @@ -1,3 +1,7 @@ +2010-04-18 Control MaxNLocator parameters after instantiation, + and via Axes.locator_params method, with corresponding + pyplot function. -EF + 2010-04-18 Control ScalarFormatter offsets directly and via the Axes.ticklabel_format() method, and add that to pyplot. -EF Modified: trunk/matplotlib/boilerplate.py =================================================================== --- trunk/matplotlib/boilerplate.py 2010-04-18 23:11:24 UTC (rev 8241) +++ trunk/matplotlib/boilerplate.py 2010-04-19 01:13:54 UTC (rev 8242) @@ -102,6 +102,7 @@ 'text', 'annotate', 'ticklabel_format', + 'locator_params', ) cmappable = { Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2010-04-18 23:11:24 UTC (rev 8241) +++ trunk/matplotlib/lib/matplotlib/axes.py 2010-04-19 01:13:54 UTC (rev 8242) @@ -1938,6 +1938,45 @@ raise AttributeError( "This method only works with the ScalarFormatter.") + def locator_params(self, axis='both', tight=False, **kwargs): + """ + Convenience method for controlling tick locators. + + Keyword arguments: + + *axis* + ['x' | 'y' | 'both'] Axis on which to operate; + default is 'both'. + + *tight* + [True | False] Parameter passed to :meth:`autoscale_view`. + + Remaining keyword arguments are passed to directly to the + :meth:`~matplotlib.ticker.MaxNLocator.set_params` method. + + Typically one might want to reduce the maximum number + of ticks and use tight bounds when plotting small + subplots, for example:: + + ax.set_locator_params(tight=True, nbins=4) + + Because the locator is involved in autoscaling, + :meth:`autoscale_view` is called automatically after + the parameters are changed. + + This presently works only for the + :class:`~matplotlib.ticker.MaxNLocator` used + by default on linear axes, but it may be generalized. + """ + _x = axis in ['x', 'both'] + _y = axis in ['y', 'both'] + if _x: + self.xaxis.get_major_locator().set_params(**kwargs) + if _y: + self.yaxis.get_major_locator().set_params(**kwargs) + self.autoscale_view(tight=tight, scalex=_x, scaley=_y) + + def set_axis_off(self): """turn off the axis""" self.axison = False Modified: trunk/matplotlib/lib/matplotlib/pyplot.py =================================================================== --- trunk/matplotlib/lib/matplotlib/pyplot.py 2010-04-18 23:11:24 UTC (rev 8241) +++ trunk/matplotlib/lib/matplotlib/pyplot.py 2010-04-19 01:13:54 UTC (rev 8242) @@ -2537,6 +2537,14 @@ # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +...@do...py_dedent(Axes.locator_params) +def locator_params(axis='both', tight=False, **kwargs): + ret = gca().locator_params(axis, tight, **kwargs) + draw_if_interactive() + return ret + +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost def autumn(): ''' set the default colormap to autumn and apply to current image if any. Modified: trunk/matplotlib/lib/matplotlib/ticker.py =================================================================== --- trunk/matplotlib/lib/matplotlib/ticker.py 2010-04-18 23:11:24 UTC (rev 8241) +++ trunk/matplotlib/lib/matplotlib/ticker.py 2010-04-19 01:13:54 UTC (rev 8242) @@ -1052,37 +1052,74 @@ """ Select no more than N intervals at nice locations. """ - - def __init__(self, nbins = 10, steps = None, - trim = True, - integer=False, - symmetric=False, - prune=None): + default_params = dict(nbins = 10, + steps = None, + trim = True, + integer=False, + symmetric=False, + prune=None) + def __init__(self, **kwargs): """ Keyword args: + + *nbins* + Maximum number of intervals; one less than max number of ticks. + + *steps* + Sequence of nice numbers starting with 1 and ending with 10; + e.g., [1, 2, 4, 5, 10] + + *integer* + If True, ticks will take only integer values. + + *symmetric* + If True, autoscaling will result in a range symmetric + about zero. + *prune* + ['lower' | 'upper' | 'both' | None] Remove edge ticks -- useful for stacked or ganged plots where the upper tick of one axes overlaps with the lower - tick of the axes above it. One of 'lower' | 'upper' | - 'both' | None. If prune=='lower', the smallest tick will + tick of the axes above it. + If prune=='lower', the smallest tick will be removed. If prune=='upper', the largest tick will be removed. If prune=='both', the largest and smallest ticks will be removed. If prune==None, no ticks will be removed. """ - self._nbins = int(nbins) - self._trim = trim - self._integer = integer - self._symmetric = symmetric - self._prune = prune - if steps is None: - self._steps = [1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] - else: - if int(steps[-1]) != 10: - steps = list(steps) - steps.append(10) - self._steps = steps - if integer: + # I left "trim" out; it defaults to True, and it is not + # clear that there is any use case for False, so we may + # want to remove that kwarg. EF 2010/04/18 + self.set_params(**self.default_params) + self.set_params(**kwargs) + + def set_params(self, **kwargs): + if 'nbins' in kwargs: + self._nbins = int(kwargs['nbins']) + if 'trim' in kwargs: + self._trim = kwargs['trim'] + if 'integer' in kwargs: + self._integer = kwargs['integer'] + if 'symmetric' in kwargs: + self._symmetric = kwargs['symmetric'] + if 'prune' in kwargs: + prune = kwargs['prune'] + if prune is not None and prune not in ['upper', 'lower', 'both']: + raise ValueError( + "prune must be 'upper', 'lower', 'both', or None") + self._prune = prune + if 'steps' in kwargs: + steps = kwargs['steps'] + if steps is None: + self._steps = [1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] + else: + if int(steps[-1]) != 10: + steps = list(steps) + steps.append(10) + self._steps = steps + if 'integer' in kwargs: + self._integer = kwargs['integer'] + if self._integer: self._steps = [n for n in self._steps if divmod(n,1)[1] < 0.001] def bin_boundaries(self, vmin, vmax): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |