@@ -628,9 +628,8 @@ def draw(self, renderer):
628628 self ._draw_labels (renderer , edgep1 , edgep2 , labeldeltas , centers , dx , dy )
629629
630630 renderer .close_group ('axis3d' )
631- self .stale = False
632-
633631 self ._clear_ticks_cache ()
632+ self .stale = False
634633
635634 @artist .allow_rasterization
636635 def draw_grid (self , renderer ):
@@ -677,6 +676,12 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
677676 # docstring inherited
678677 if not self .get_visible ():
679678 return
679+
680+ # We need to reset the ticks cache here - get_tightbbox() is called
681+ # during layout calculations (e.g., constrained_layout) outside of
682+ # draw(), and must always recalculate to reflect current state.
683+ self ._clear_ticks_cache ()
684+
680685 # We have to directly access the internal data structures
681686 # (and hope they are up to date) because at draw time we
682687 # shift the ticks and their labels around in (x, y) space
@@ -708,10 +713,7 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
708713
709714 ticks = ticks_to_draw
710715
711- # Don't use cached values here - get_tightbbox() is called during
712- # layout calculations (e.g., constrained_layout) outside of draw(),
713- # and must always recalculate to reflect current state.
714- bb_1 , bb_2 = self ._get_ticklabel_bboxes (ticks , renderer , _use_cache = False )
716+ bb_1 , bb_2 = self ._get_ticklabel_bboxes (ticks , renderer , _use_cache = True )
715717 other = []
716718
717719 if self .offsetText .get_visible () and self .offsetText .get_text ():
@@ -722,6 +724,7 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
722724 self .label .get_text ()):
723725 other .append (self .label .get_window_extent (renderer ))
724726
727+ self ._clear_ticks_cache ()
725728 return mtransforms .Bbox .union ([* bb_1 , * bb_2 , * other ])
726729
727730 d_interval = _api .deprecated (
0 commit comments