@@ -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