diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index e7f6724c4372..88e2324817b5 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -20,6 +20,7 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms import matplotlib.units as munits +from matplotlib.ticker import NullLocator _log = logging.getLogger(__name__) @@ -568,11 +569,15 @@ def __get__(self, instance, owner): # list, then create the tick and append it. if self._major: instance.majorTicks = [] + if isinstance(instance.major.locator, NullLocator): + return instance.majorTicks tick = instance._get_tick(major=True) instance.majorTicks.append(tick) return instance.majorTicks else: instance.minorTicks = [] + if isinstance(instance.minor.locator, NullLocator): + return instance.minorTicks tick = instance._get_tick(major=False) instance.minorTicks.append(tick) return instance.minorTicks @@ -2208,6 +2213,8 @@ def _get_ticks_position(self): - "default" if only tick1line, tick2line and label1 are visible; - "unknown" otherwise. """ + if not len(self.majorTicks) or not len(self.minorTicks): + return "unknown" major = self.majorTicks[0] minor = self.minorTicks[0] if all(tick.tick1line.get_visible() diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index f6fa0ea7b982..ae56d1bc99c3 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -13,6 +13,7 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms from matplotlib.spines import Spine +from matplotlib.ticker import AutoLocator class PolarTransform(mtransforms.Transform): @@ -428,8 +429,10 @@ def _set_scale(self, value, **kwargs): "The xscale cannot be set on a polar plot") super()._set_scale(value, **kwargs) # LinearScale.set_default_locators_and_formatters just set the major - # locator to be an AutoLocator, so we customize it here to have ticks + # locator to be an AutoLocator(maybe), so we customize it here to have ticks # at sensible degree multiples. + if not isinstance(self.get_major_locator(), AutoLocator): + self.set_major_locator(AutoLocator()) self.get_major_locator().set_params(steps=[1, 1.5, 3, 4.5, 9, 10]) self._wrap_locator_formatter() diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index d86de461efc8..36df9da194b6 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -102,7 +102,11 @@ def __init__(self, axis): def set_default_locators_and_formatters(self, axis): # docstring inherited - axis.set_major_locator(AutoLocator()) + if (axis.axis_name == 'x' and (mpl.rcParams['xtick.top'] or mpl.rcParams['xtick.bottom']) or + axis.axis_name == 'y' and (mpl.rcParams['ytick.left'] or mpl.rcParams['ytick.right'])): + axis.set_major_locator(AutoLocator()) + else: + axis.set_major_locator(NullLocator()) axis.set_major_formatter(ScalarFormatter()) axis.set_minor_formatter(NullFormatter()) # update the minor locator for x and y axis based on rcParams