@@ -661,6 +661,8 @@ def __init__(self, axes, *, pickradius=15, clear=True):
661661 self ._major_tick_kw = dict ()
662662 self ._minor_tick_kw = dict ()
663663
664+ self ._cached_ticks_to_draw = None
665+
664666 if clear :
665667 self .clear ()
666668 else :
@@ -1278,11 +1280,15 @@ def _set_artist_props(self, a):
12781280 return
12791281 a .set_figure (self .get_figure (root = False ))
12801282
1281- def _update_ticks (self ):
1283+ def _update_ticks (self , * , _use_cached = False ):
12821284 """
12831285 Update ticks (position and labels) using the current data interval of
12841286 the axes. Return the list of ticks that will be drawn.
12851287 """
1288+ # Return cached result if available and requested
1289+ if _use_cached and self ._cached_ticks_to_draw is not None :
1290+ return self ._cached_ticks_to_draw
1291+
12861292 major_locs = self .get_majorticklocs ()
12871293 major_labels = self .major .formatter .format_ticks (major_locs )
12881294 major_ticks = self .get_major_ticks (len (major_locs ))
@@ -1328,6 +1334,8 @@ def _update_ticks(self):
13281334 if mtransforms ._interval_contains_close (interval_t , loc_t ):
13291335 ticks_to_draw .append (tick )
13301336
1337+ # Cache the result before returning
1338+ self ._cached_ticks_to_draw = ticks_to_draw
13311339 return ticks_to_draw
13321340
13331341 def _get_ticklabel_bboxes (self , ticks , renderer ):
@@ -1353,7 +1361,10 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13531361 return
13541362 if renderer is None :
13551363 renderer = self .get_figure (root = True )._get_renderer ()
1356- ticks_to_draw = self ._update_ticks ()
1364+ # Don't use cached values here - get_tightbbox() is called during
1365+ # layout calculations (e.g., constrained_layout) outside of draw(),
1366+ # and must always recalculate to reflect current state.
1367+ ticks_to_draw = self ._update_ticks (_use_cached = False )
13571368
13581369 self ._update_label_position (renderer )
13591370
@@ -1405,7 +1416,10 @@ def draw(self, renderer):
14051416 return
14061417 renderer .open_group (__name__ , gid = self .get_gid ())
14071418
1408- ticks_to_draw = self ._update_ticks ()
1419+ # Clear tick cache for this draw cycle
1420+ self ._cached_ticks_to_draw = None
1421+
1422+ ticks_to_draw = self ._update_ticks (_use_cached = True )
14091423 tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer )
14101424
14111425 for tick in ticks_to_draw :
@@ -2242,7 +2256,7 @@ def _get_tick_boxes_siblings(self, renderer):
22422256 # If we want to align labels from other Axes:
22432257 for ax in grouper .get_siblings (self .axes ):
22442258 axis = ax ._axis_map [name ]
2245- ticks_to_draw = axis ._update_ticks ()
2259+ ticks_to_draw = axis ._update_ticks (_use_cached = True )
22462260 tlb , tlb2 = axis ._get_ticklabel_bboxes (ticks_to_draw , renderer )
22472261 bboxes .extend (tlb )
22482262 bboxes2 .extend (tlb2 )
0 commit comments