@@ -435,7 +435,7 @@ def _axmask(self):
435435
436436 def _draw_ticks (self , renderer , edgep1 , centers , deltas , highs ,
437437 deltas_per_point , pos ):
438- ticks = self ._update_ticks ()
438+ ticks = self ._update_ticks (_use_cached = True )
439439 info = self ._axinfo
440440 index = info ["i" ]
441441 juggled = info ["juggled" ]
@@ -629,14 +629,18 @@ def draw(self, renderer):
629629 renderer .close_group ('axis3d' )
630630 self .stale = False
631631
632+ # Reset cached values for next draw cycle, in case not called by Axes3D.draw()
633+ self ._cached_ticks_to_draw = None
634+ self ._cached_ticklabel_bboxes = None
635+
632636 @artist .allow_rasterization
633637 def draw_grid (self , renderer ):
634638 if not self .axes ._draw_grid :
635639 return
636640
637641 renderer .open_group ("grid3d" , gid = self .get_gid ())
638642
639- ticks = self ._update_ticks ()
643+ ticks = self ._update_ticks (_use_cached = True )
640644 if len (ticks ):
641645 # Get general axis information:
642646 info = self ._axinfo
@@ -705,7 +709,10 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
705709
706710 ticks = ticks_to_draw
707711
708- bb_1 , bb_2 = self ._get_ticklabel_bboxes (ticks , renderer )
712+ # Don't use cached values here - get_tightbbox() is called during
713+ # layout calculations (e.g., constrained_layout) outside of draw(),
714+ # and must always recalculate to reflect current state.
715+ bb_1 , bb_2 = self ._get_ticklabel_bboxes (ticks , renderer , _use_cached = False )
709716 other = []
710717
711718 if self .offsetText .get_visible () and self .offsetText .get_text ():
0 commit comments