Skip to content

Commit ea16190

Browse files
committed
FIX: get_tick_position() disregards major/minor ticks that are not drawn
Closes matplotlib#21337 by ignoring major/minor ticks, if they are not used because of a NullLocator.
1 parent c11175d commit ea16190

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

lib/matplotlib/axis.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import matplotlib.ticker as mticker
2121
import matplotlib.transforms as mtransforms
2222
import matplotlib.units as munits
23+
from matplotlib.ticker import NullLocator
2324

2425
_log = logging.getLogger(__name__)
2526

@@ -2277,7 +2278,8 @@ def _get_ticks_position(self):
22772278
Helper for `XAxis.get_ticks_position` and `YAxis.get_ticks_position`.
22782279
22792280
Check the visibility of tick1line, label1, tick2line, and label2 on
2280-
the first major and the first minor ticks, and return
2281+
the first major and the first minor ticks, provided these ticks are used
2282+
i.e. the corresponding locator is not a NullLocator, and return
22812283
22822284
- 1 if only tick1line and label1 are visible (which corresponds to
22832285
"bottom" for the x-axis and "left" for the y-axis);
@@ -2286,25 +2288,29 @@ def _get_ticks_position(self):
22862288
- "default" if only tick1line, tick2line and label1 are visible;
22872289
- "unknown" otherwise.
22882290
"""
2289-
major = self.majorTicks[0]
2290-
minor = self.minorTicks[0]
2291+
representative_ticks = []
2292+
if not isinstance(self.get_major_locator(), NullLocator):
2293+
representative_ticks.append(self.majorTicks[0])
2294+
if not isinstance(self.get_minor_locator(), NullLocator):
2295+
representative_ticks.append(self.minorTicks[0])
2296+
22912297
if all(tick.tick1line.get_visible()
22922298
and not tick.tick2line.get_visible()
22932299
and tick.label1.get_visible()
22942300
and not tick.label2.get_visible()
2295-
for tick in [major, minor]):
2301+
for tick in representative_ticks):
22962302
return 1
22972303
elif all(tick.tick2line.get_visible()
22982304
and not tick.tick1line.get_visible()
22992305
and tick.label2.get_visible()
23002306
and not tick.label1.get_visible()
2301-
for tick in [major, minor]):
2307+
for tick in representative_ticks):
23022308
return 2
23032309
elif all(tick.tick1line.get_visible()
23042310
and tick.tick2line.get_visible()
23052311
and tick.label1.get_visible()
23062312
and not tick.label2.get_visible()
2307-
for tick in [major, minor]):
2313+
for tick in representative_ticks):
23082314
return "default"
23092315
else:
23102316
return "unknown"

lib/matplotlib/tests/test_axis.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,32 @@ def test_translate_tick_params_reverse():
3838
{'labelbottom': 'a', 'labeltop': 'b', 'bottom': 'c', 'top': 'd'})
3939
assert (ax.yaxis._translate_tick_params(kw, reverse=True) ==
4040
{'labelleft': 'a', 'labelright': 'b', 'left': 'c', 'right': 'd'})
41+
42+
43+
def test_get_tick_position_rcParams():
44+
"""Test that get_tick_position() correctly picks up rcParams tick positions."""
45+
plt.rcParams.update({
46+
"xtick.top": 1, "xtick.labeltop": 1, "xtick.bottom": 0, "xtick.labelbottom": 0,
47+
"ytick.right": 1, "ytick.labelright": 1, "ytick.left": 0, "ytick.labelleft": 0,
48+
})
49+
ax = plt.figure().add_subplot()
50+
assert ax.xaxis.get_ticks_position() == "top"
51+
assert ax.yaxis.get_ticks_position() == "right"
52+
53+
54+
def test_get_tick_position_tick_top_tick_right():
55+
"""Test that get_tick_position() correctly picks up tick_top() / tick_right()."""
56+
ax = plt.figure().add_subplot()
57+
ax.xaxis.tick_top()
58+
ax.yaxis.tick_right()
59+
assert ax.xaxis.get_ticks_position() == "top"
60+
assert ax.yaxis.get_ticks_position() == "right"
61+
62+
63+
def test_get_tick_position_tick_params():
64+
"""Test that get_tick_position() correctly picks up tick_params()."""
65+
ax = plt.figure().add_subplot()
66+
ax.tick_params(top=True, labeltop=True, bottom=False, labelbottom=False,
67+
right=True, labelright=True, left=False, labelleft=False)
68+
assert ax.xaxis.get_ticks_position() == "top"
69+
assert ax.yaxis.get_ticks_position() == "right"

0 commit comments

Comments
 (0)