Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5708dc8

Browse files
committed
fix
1 parent 3fe222c commit 5708dc8

1 file changed

Lines changed: 30 additions & 9 deletions

File tree

lib/matplotlib/axis.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,9 @@ def __init__(self, axes, *, pickradius=15, clear=True):
667667
# Initialize here for testing; later add API
668668
self._major_tick_kw = dict()
669669
self._minor_tick_kw = dict()
670+
# Populated by ``Axis.clear`` / ``_reset_{major,minor}_tick_kw``.
671+
self._major_rcparams_snapshot = {}
672+
self._minor_rcparams_snapshot = {}
670673

671674
if clear:
672675
self.clear()
@@ -881,7 +884,13 @@ def _tick_kw_from_rcparams(self, major):
881884
into the kw dict at init/clear time restores parity with that
882885
pre-lazy path.
883886
"""
884-
name = f"{self.axis_name}tick" # 'xtick' or 'ytick'
887+
# `Tick.__init__` uses the tick class's ``__name__`` class attribute
888+
# ('xtick'/'ytick') as the rcParam prefix; walk the MRO to find it
889+
# (polar's ThetaTick/RadialTick inherit it from XTick/YTick, and
890+
# ``cls.__name__`` on the class itself is still the Python class name).
891+
name = next(c.__dict__['__name__']
892+
for c in self._tick_class.__mro__
893+
if '__name__' in c.__dict__)
885894
major_minor = "major" if major else "minor"
886895
rc = mpl.rcParams
887896
labelcolor = rc[f"{name}.labelcolor"]
@@ -907,10 +916,14 @@ def _tick_kw_from_rcparams(self, major):
907916
}
908917

909918
def _reset_major_tick_kw(self):
910-
self._major_tick_kw = self._tick_kw_from_rcparams(major=True)
919+
# Wipe explicit user overrides; refresh the rcParams snapshot so a
920+
# subsequent tick materialization uses the *current* rcParams.
921+
self._major_tick_kw.clear()
922+
self._major_rcparams_snapshot = self._tick_kw_from_rcparams(major=True)
911923

912924
def _reset_minor_tick_kw(self):
913-
self._minor_tick_kw = self._tick_kw_from_rcparams(major=False)
925+
self._minor_tick_kw.clear()
926+
self._minor_rcparams_snapshot = self._tick_kw_from_rcparams(major=False)
914927

915928
def clear(self):
916929
"""
@@ -941,10 +954,12 @@ def clear(self):
941954
# Clear the callback registry for this axis, or it may "leak"
942955
self.callbacks = cbook.CallbackRegistry(signals=["units"])
943956

944-
# Snapshot rcParams-derived tick kwargs so lazily-materialized
945-
# Ticks see the same values the eager (pre-lazy) code path did.
946-
self._reset_major_tick_kw()
947-
self._reset_minor_tick_kw()
957+
# Capture rcParams-derived tick kwargs at clear-time so that a
958+
# lazily-materialized Tick sees the same values an eager one would
959+
# have. User-set overrides in ``_{major,minor}_tick_kw`` persist
960+
# across clear (tested by ``test_axes_clear_behavior``).
961+
self._major_rcparams_snapshot = self._tick_kw_from_rcparams(major=True)
962+
self._minor_rcparams_snapshot = self._tick_kw_from_rcparams(major=False)
948963
self.reset_ticks()
949964

950965
self._converter = None
@@ -1707,8 +1722,14 @@ def _get_tick(self, major):
17071722
raise NotImplementedError(
17081723
f"The Axis subclass {self.__class__.__name__} must define "
17091724
"_tick_class or reimplement _get_tick()")
1710-
tick_kw = self._major_tick_kw if major else self._minor_tick_kw
1711-
return self._tick_class(self.axes, 0, major=major, **tick_kw)
1725+
# Merge the rcParams snapshot (captured at Axis.clear-time, so it
1726+
# reflects any ``rc_context`` / ``plt.xkcd()`` active then) with
1727+
# explicit overrides from ``set_tick_params``; overrides win.
1728+
snapshot = (self._major_rcparams_snapshot if major
1729+
else self._minor_rcparams_snapshot)
1730+
overrides = self._major_tick_kw if major else self._minor_tick_kw
1731+
return self._tick_class(self.axes, 0, major=major,
1732+
**{**snapshot, **overrides})
17121733

17131734
def _get_tick_label_size(self, axis_name):
17141735
"""

0 commit comments

Comments
 (0)