From d203807b8eb075cb9b49dbb03fa812336c69a3ba Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 16 Nov 2015 18:48:02 -0500 Subject: [PATCH 01/13] Fix #5488: Adjust nticks based on length of axis --- lib/matplotlib/axis.py | 29 +++++++++++++++++++++++++ lib/matplotlib/ticker.py | 46 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 3c578d431adc..141f0b394de3 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1665,6 +1665,13 @@ def axis_date(self, tz=None): tz = pytz.timezone(tz) self.update_units(datetime.datetime(2009, 1, 1, 0, 0, 0, 0, tz)) + def get_tick_space(self): + """ + Return the estimated number of ticks that can fit on the axis. + """ + # Must be overridden in the subclass + raise NotImplementedError() + class XAxis(Axis): __name__ = 'xaxis' @@ -1988,6 +1995,18 @@ def set_default_intervals(self): self.axes.viewLim.intervalx = xmin, xmax self.stale = True + def get_tick_space(self): + if self._tick_space is None: + ends = self.axes.transAxes.transform([[0, 0], [1, 0]]) + length = ((ends[1][0] - ends[0][0]) / self.axes.figure.dpi) * 72.0 + tick = self._get_tick(True) + # There is a heuristic here that the aspect ratio of tick text + # is no more than 2:1 + size = tick.label1.get_size() * 3 + size *= np.cos(np.deg2rad(tick.label1.get_rotation())) + self._tick_space = np.floor(length / size) + return self._tick_space + class YAxis(Axis): __name__ = 'yaxis' @@ -2318,3 +2337,13 @@ def set_default_intervals(self): if not viewMutated: self.axes.viewLim.intervaly = ymin, ymax self.stale = True + + def get_tick_space(self): + # TODO: cache this computation + ends = self.axes.transAxes.transform([[0, 0], [0, 1]]) + length = ((ends[1][1] - ends[0][1]) / self.axes.figure.dpi) * 72.0 + tick = self._get_tick(True) + # Having a spacing of at least 2 just looks good. + size = tick.label1.get_size() * 2.0 + size *= np.cos(np.deg2rad(tick.label1.get_rotation())) + return np.floor(length / size) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index b487671fb5e9..48f0a158233e 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1472,6 +1472,48 @@ def view_limits(self, dmin, dmax): return dmin, dmax +class AutoSpacedLocator(MaxNLocator): + """ + Behaves like a MaxNLocator, except N is automatically determined + from the length of the axis. + """ + def __init__(self, *args, **kwargs): + """ + Keyword args: + + *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. + 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. + + """ + if 'nbins' in kwargs: + raise ValueError( + 'AutoSpacedLocator does not take nbins as an argument') + self.set_params(**self.default_params) + self.set_params(**kwargs) + + def __call__(self): + self._nbins = self.axis.get_tick_space() + return super(AutoSpacedLocator, self).__call__() + + def decade_down(x, base=10): 'floor x to the nearest lower decade' if x == 0.0: @@ -1899,9 +1941,9 @@ def tick_values(self, vmin, vmax): return self.raise_if_exceeds(np.array(ticklocs)) -class AutoLocator(MaxNLocator): +class AutoLocator(AutoSpacedLocator): def __init__(self): - MaxNLocator.__init__(self, nbins=9, steps=[1, 2, 5, 10]) + AutoSpacedLocator.__init__(self, steps=[1, 2, 5, 10]) class AutoMinorLocator(Locator): From 63c9b43f38bc15b427bbf669a20a7923a2f3290a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 16 Nov 2015 20:45:56 -0500 Subject: [PATCH 02/13] Cache tick space calculation --- lib/matplotlib/axis.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 141f0b394de3..ebe7efad2cea 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -654,6 +654,7 @@ def __init__(self, axes, pickradius=15): # Initialize here for testing; later add API self._major_tick_kw = dict() self._minor_tick_kw = dict() + self._tick_space = None self.cla() self._set_scale('linear') @@ -785,6 +786,7 @@ def set_tick_params(self, which='major', reset=False, **kw): for tick in self.minorTicks: tick._apply_params(**self._minor_tick_kw) self.stale = True + self._tick_space = None @staticmethod def _translate_tick_kw(kw, to_init_kw=True): @@ -2339,11 +2341,12 @@ def set_default_intervals(self): self.stale = True def get_tick_space(self): - # TODO: cache this computation - ends = self.axes.transAxes.transform([[0, 0], [0, 1]]) - length = ((ends[1][1] - ends[0][1]) / self.axes.figure.dpi) * 72.0 - tick = self._get_tick(True) - # Having a spacing of at least 2 just looks good. - size = tick.label1.get_size() * 2.0 - size *= np.cos(np.deg2rad(tick.label1.get_rotation())) - return np.floor(length / size) + if self._tick_space is None: + ends = self.axes.transAxes.transform([[0, 0], [0, 1]]) + length = ((ends[1][1] - ends[0][1]) / self.axes.figure.dpi) * 72.0 + tick = self._get_tick(True) + # Having a spacing of at least 2 just looks good. + size = tick.label1.get_size() * 2.0 + size *= np.cos(np.deg2rad(tick.label1.get_rotation())) + self._tick_space = np.floor(length / size) + return self._tick_space From 926c7e0f13941310572b4af040294df6366e3114 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 18 Nov 2015 09:05:36 -0500 Subject: [PATCH 03/13] Make behavior backward compatible --- examples/units/basic_units.py | 6 +++++- lib/matplotlib/axis.py | 5 ++++- lib/matplotlib/scale.py | 10 ++++++++-- lib/matplotlib/ticker.py | 6 ++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/examples/units/basic_units.py b/examples/units/basic_units.py index f8425f1ec45c..fa83f7643b1a 100644 --- a/examples/units/basic_units.py +++ b/examples/units/basic_units.py @@ -328,8 +328,12 @@ def axisinfo(unit, axis): label=unit.fullname, ) elif unit == degrees: + if rcParams['_internal.classic_mode']: + locator = ticker.ClassicAutoLocator() + else: + locator = ticker.AutoLocator() return units.AxisInfo( - majloc=ticker.AutoLocator(), + majloc=locator, majfmt=ticker.FormatStrFormatter(r'$%i^\circ$'), label=unit.fullname, ) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index ebe7efad2cea..267ca941f88a 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -711,7 +711,10 @@ def get_children(self): def cla(self): 'clear the current axis' - self.set_major_locator(mticker.AutoLocator()) + if rcParams['_internal.classic_mode']: + self.set_major_locator(mticker.ClassicAutoLocator()) + else: + self.set_major_locator(mticker.AutoLocator()) self.set_major_formatter(mticker.ScalarFormatter()) self.set_minor_locator(mticker.NullLocator()) self.set_minor_formatter(mticker.NullFormatter()) diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index b38e5e500a54..de1cedc3e210 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -6,11 +6,13 @@ import numpy as np from numpy import ma +from matplotlib import rcParams from matplotlib.cbook import dedent from matplotlib.ticker import (NullFormatter, ScalarFormatter, LogFormatterMathtext, LogitFormatter) from matplotlib.ticker import (NullLocator, LogLocator, AutoLocator, - SymmetricalLogLocator, LogitLocator) + SymmetricalLogLocator, LogitLocator, + ClassicAutoLocator) from matplotlib.transforms import Transform, IdentityTransform from matplotlib import docstring @@ -71,7 +73,11 @@ def set_default_locators_and_formatters(self, axis): Set the locators and formatters to reasonable defaults for linear scaling. """ - axis.set_major_locator(AutoLocator()) + if rcParams['_internal.classic_mode']: + locator = ClassicAutoLocator() + else: + locator = AutoLocator() + axis.set_major_locator(locator) axis.set_major_formatter(ScalarFormatter()) axis.set_minor_locator(NullLocator()) axis.set_minor_formatter(NullFormatter()) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 48f0a158233e..b7bace54ce02 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1946,6 +1946,12 @@ def __init__(self): AutoSpacedLocator.__init__(self, steps=[1, 2, 5, 10]) +class ClassicAutoLocator(MaxNLocator): + # Used only for classic style + def __init__(self): + MaxNLocator.__init__(self, nbins=9, steps=[1, 2, 5, 10]) + + class AutoMinorLocator(Locator): """ Dynamically find minor tick positions based on the positions of From 53e34915aa007f2541d90c880ab32a0d478e0a7d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2015 08:34:08 -0500 Subject: [PATCH 04/13] Fix example --- examples/units/basic_units.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/units/basic_units.py b/examples/units/basic_units.py index fa83f7643b1a..e0663c765d75 100644 --- a/examples/units/basic_units.py +++ b/examples/units/basic_units.py @@ -6,6 +6,7 @@ import matplotlib.ticker as ticker from matplotlib.axes import Axes from matplotlib.cbook import iterable +from matplotlib import rcParams class ProxyDelegate(object): From 7a9a5964be574ff82fc6c64c6018007df7c44279 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2015 08:37:06 -0500 Subject: [PATCH 05/13] Add test --- .../baseline_images/test_axes/auto_numticks.png | Bin 0 -> 21360 bytes lib/matplotlib/tests/test_axes.py | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/auto_numticks.png diff --git a/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks.png b/lib/matplotlib/tests/baseline_images/test_axes/auto_numticks.png new file mode 100644 index 0000000000000000000000000000000000000000..91d22076845722decc41e4e3763f46989366d99a GIT binary patch literal 21360 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 3a1a25053da5..b91c6553c348 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -4191,6 +4191,12 @@ def test_axes_margins(): assert ax.get_ybound() == (-0.5, 9.5) +@image_comparison(baseline_images=["auto_numticks"], style='default', + extensions=['png']) +def test_auto_numticks(): + fig, axes = plt.subplots(4, 4) + + if __name__ == '__main__': import nose import sys From 5b16906f6479155a79652acb99726ae3d35256fd Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2015 15:56:28 -0500 Subject: [PATCH 06/13] Be explicit about kwargs --- lib/matplotlib/ticker.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index b7bace54ce02..adec57c4cba8 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1477,7 +1477,7 @@ class AutoSpacedLocator(MaxNLocator): Behaves like a MaxNLocator, except N is automatically determined from the length of the axis. """ - def __init__(self, *args, **kwargs): + def __init__(self, steps=None, integer=False, symmetric=False, prune=None): """ Keyword args: @@ -1503,11 +1503,9 @@ def __init__(self, *args, **kwargs): will be removed. If prune==None, no ticks will be removed. """ - if 'nbins' in kwargs: - raise ValueError( - 'AutoSpacedLocator does not take nbins as an argument') self.set_params(**self.default_params) - self.set_params(**kwargs) + self.set_params(steps=steps, integer=integer, symmetric=symmetric, + prune=prune) def __call__(self): self._nbins = self.axis.get_tick_space() From 2e1af1fdc79337ddc32c5535fa79b118ae8f9e53 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2015 18:26:57 -0500 Subject: [PATCH 07/13] Blacklist nbins --- lib/matplotlib/ticker.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index adec57c4cba8..1495120a2d24 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1507,6 +1507,12 @@ def __init__(self, steps=None, integer=False, symmetric=False, prune=None): self.set_params(steps=steps, integer=integer, symmetric=symmetric, prune=prune) + def set_params(self, **kwargs): + if 'nbins' in kwargs: + raise TypeError( + "set_params got an unexpected keyword argument 'nbins'") + return super(AutoSpacedLocator, self).set_params(**kwargs) + def __call__(self): self._nbins = self.axis.get_tick_space() return super(AutoSpacedLocator, self).__call__() From 5a2f9620d1fc5fd1e27a1af26b8c0333c99327f9 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Dec 2015 07:53:29 -0500 Subject: [PATCH 08/13] Simplify -- use nbins == None to indicate auto --- examples/units/basic_units.py | 7 +--- lib/matplotlib/axis.py | 7 ++-- lib/matplotlib/scale.py | 10 ++---- lib/matplotlib/ticker.py | 68 +++++++---------------------------- 4 files changed, 17 insertions(+), 75 deletions(-) diff --git a/examples/units/basic_units.py b/examples/units/basic_units.py index e0663c765d75..f8425f1ec45c 100644 --- a/examples/units/basic_units.py +++ b/examples/units/basic_units.py @@ -6,7 +6,6 @@ import matplotlib.ticker as ticker from matplotlib.axes import Axes from matplotlib.cbook import iterable -from matplotlib import rcParams class ProxyDelegate(object): @@ -329,12 +328,8 @@ def axisinfo(unit, axis): label=unit.fullname, ) elif unit == degrees: - if rcParams['_internal.classic_mode']: - locator = ticker.ClassicAutoLocator() - else: - locator = ticker.AutoLocator() return units.AxisInfo( - majloc=locator, + majloc=ticker.AutoLocator(), majfmt=ticker.FormatStrFormatter(r'$%i^\circ$'), label=unit.fullname, ) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 267ca941f88a..6597d70f8ac7 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -711,10 +711,7 @@ def get_children(self): def cla(self): 'clear the current axis' - if rcParams['_internal.classic_mode']: - self.set_major_locator(mticker.ClassicAutoLocator()) - else: - self.set_major_locator(mticker.AutoLocator()) + self.set_major_locator(mticker.AutoLocator()) self.set_major_formatter(mticker.ScalarFormatter()) self.set_minor_locator(mticker.NullLocator()) self.set_minor_formatter(mticker.NullFormatter()) @@ -2006,7 +2003,7 @@ def get_tick_space(self): length = ((ends[1][0] - ends[0][0]) / self.axes.figure.dpi) * 72.0 tick = self._get_tick(True) # There is a heuristic here that the aspect ratio of tick text - # is no more than 2:1 + # is no more than 3:1 size = tick.label1.get_size() * 3 size *= np.cos(np.deg2rad(tick.label1.get_rotation())) self._tick_space = np.floor(length / size) diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index de1cedc3e210..b38e5e500a54 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -6,13 +6,11 @@ import numpy as np from numpy import ma -from matplotlib import rcParams from matplotlib.cbook import dedent from matplotlib.ticker import (NullFormatter, ScalarFormatter, LogFormatterMathtext, LogitFormatter) from matplotlib.ticker import (NullLocator, LogLocator, AutoLocator, - SymmetricalLogLocator, LogitLocator, - ClassicAutoLocator) + SymmetricalLogLocator, LogitLocator) from matplotlib.transforms import Transform, IdentityTransform from matplotlib import docstring @@ -73,11 +71,7 @@ def set_default_locators_and_formatters(self, axis): Set the locators and formatters to reasonable defaults for linear scaling. """ - if rcParams['_internal.classic_mode']: - locator = ClassicAutoLocator() - else: - locator = AutoLocator() - axis.set_major_locator(locator) + axis.set_major_locator(AutoLocator()) axis.set_major_formatter(ScalarFormatter()) axis.set_minor_locator(NullLocator()) axis.set_minor_formatter(NullFormatter()) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 1495120a2d24..efe98dad7553 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1337,7 +1337,7 @@ class MaxNLocator(Locator): """ Select no more than N intervals at nice locations. """ - default_params = dict(nbins=10, + default_params = dict(nbins=None, steps=None, trim=True, integer=False, @@ -1349,7 +1349,9 @@ def __init__(self, *args, **kwargs): Keyword args: *nbins* - Maximum number of intervals; one less than max number of ticks. + Maximum number of intervals; one less than max number of + ticks. If `None`, the number of bins will be + automatically determined based on the length of the axis. *steps* Sequence of nice numbers starting with 1 and ending with 10; @@ -1416,6 +1418,8 @@ def set_params(self, **kwargs): def bin_boundaries(self, vmin, vmax): nbins = self._nbins + if nbins is None: + nbins = self.axis.get_tick_space() scale, offset = scale_range(vmin, vmax, nbins) if self._integer: scale = max(1, scale) @@ -1472,52 +1476,6 @@ def view_limits(self, dmin, dmax): return dmin, dmax -class AutoSpacedLocator(MaxNLocator): - """ - Behaves like a MaxNLocator, except N is automatically determined - from the length of the axis. - """ - def __init__(self, steps=None, integer=False, symmetric=False, prune=None): - """ - Keyword args: - - *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. - 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.set_params(**self.default_params) - self.set_params(steps=steps, integer=integer, symmetric=symmetric, - prune=prune) - - def set_params(self, **kwargs): - if 'nbins' in kwargs: - raise TypeError( - "set_params got an unexpected keyword argument 'nbins'") - return super(AutoSpacedLocator, self).set_params(**kwargs) - - def __call__(self): - self._nbins = self.axis.get_tick_space() - return super(AutoSpacedLocator, self).__call__() - - def decade_down(x, base=10): 'floor x to the nearest lower decade' if x == 0.0: @@ -1945,15 +1903,13 @@ def tick_values(self, vmin, vmax): return self.raise_if_exceeds(np.array(ticklocs)) -class AutoLocator(AutoSpacedLocator): +class AutoLocator(MaxNLocator): def __init__(self): - AutoSpacedLocator.__init__(self, steps=[1, 2, 5, 10]) - - -class ClassicAutoLocator(MaxNLocator): - # Used only for classic style - def __init__(self): - MaxNLocator.__init__(self, nbins=9, steps=[1, 2, 5, 10]) + if rcParams['_internal.classic_mode']: + nbins = 9 + else: + nbins = None + MaxNLocator.__init__(self, nbins=nbins, steps=[1, 2, 5, 10]) class AutoMinorLocator(Locator): From 5b75d0be52d0a312ac57e6c5ad8d1c9d321d6214 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Dec 2015 08:25:48 -0500 Subject: [PATCH 09/13] Use 'auto' instead of None --- lib/matplotlib/ticker.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index efe98dad7553..6f977ac60d27 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1337,7 +1337,7 @@ class MaxNLocator(Locator): """ Select no more than N intervals at nice locations. """ - default_params = dict(nbins=None, + default_params = dict(nbins='auto', steps=None, trim=True, integer=False, @@ -1350,7 +1350,7 @@ def __init__(self, *args, **kwargs): *nbins* Maximum number of intervals; one less than max number of - ticks. If `None`, the number of bins will be + ticks. If the string `'auto'`, the number of bins will be automatically determined based on the length of the axis. *steps* @@ -1418,7 +1418,7 @@ def set_params(self, **kwargs): def bin_boundaries(self, vmin, vmax): nbins = self._nbins - if nbins is None: + if nbins == 'auto': nbins = self.axis.get_tick_space() scale, offset = scale_range(vmin, vmax, nbins) if self._integer: @@ -1908,7 +1908,7 @@ def __init__(self): if rcParams['_internal.classic_mode']: nbins = 9 else: - nbins = None + nbins = 'auto' MaxNLocator.__init__(self, nbins=nbins, steps=[1, 2, 5, 10]) From 6137ecc489e2b79bdb182a7fbfd2ff4412fb5f90 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Dec 2015 15:39:19 -0500 Subject: [PATCH 10/13] Bugfix --- lib/matplotlib/ticker.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 6f977ac60d27..5f5ace75775c 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1389,7 +1389,9 @@ def __init__(self, *args, **kwargs): def set_params(self, **kwargs): """Set parameters within this locator.""" if 'nbins' in kwargs: - self._nbins = int(kwargs['nbins']) + self._nbins = kwargs['nbins'] + if self._nbins != 'auto': + self._nbins = int(self._nbins) if 'trim' in kwargs: self._trim = kwargs['trim'] if 'integer' in kwargs: From 97e0d9f48c10d3f40f76717914c559c4cc23bd8d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Sat, 5 Dec 2015 06:47:07 -0800 Subject: [PATCH 11/13] Add get_tick_space to _DummyAxis --- lib/matplotlib/ticker.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 5f5ace75775c..aa2fc19827b9 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -202,6 +202,10 @@ def get_data_interval(self): def set_data_interval(self, vmin, vmax): self.dataLim.intervalx = vmin, vmax + def get_tick_space(self): + # Just use the long-standing default of nbins==9 + return 9 + class TickHelper(object): axis = None From b4aa340a3bf55678675212066fdbbfebf506abb9 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Sun, 6 Dec 2015 06:15:55 -0800 Subject: [PATCH 12/13] Update test image --- .../test_artist/default_edges.png | Bin 24276 -> 24194 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_artist/default_edges.png b/lib/matplotlib/tests/baseline_images/test_artist/default_edges.png index 074f1bf404d941d3dfa3cda5e2672472216a06ee..612eb3dd3c48ee1447d91677b07b1de3f1342010 100644 GIT binary patch literal 24194 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 From eafa79b59650f6c0ec3bb9aacdbf61bcc6ed6009 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Dec 2015 10:09:50 -0500 Subject: [PATCH 13/13] Fix backward compatibility on MaxNLocator --- lib/matplotlib/ticker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index aa2fc19827b9..2c7ce1f62b1b 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1341,7 +1341,7 @@ class MaxNLocator(Locator): """ Select no more than N intervals at nice locations. """ - default_params = dict(nbins='auto', + default_params = dict(nbins=10, steps=None, trim=True, integer=False,