Skip to content

Commit a1e4fab

Browse files
authored
Merge pull request #29388 from timhoffm/fix-tick-position
FIX: get_tick_position() should disregard major/minor ticks that are not drawn
2 parents 86f089c + ea16190 commit a1e4fab

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

lib/matplotlib/axis.py

+12-6
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

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

lib/matplotlib/tests/test_axis.py

+29
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)