@@ -662,6 +662,7 @@ def __init__(self, axes, *, pickradius=15, clear=True):
662662 self ._minor_tick_kw = dict ()
663663
664664 self ._cached_ticks_to_draw = None
665+ self ._cached_ticklabel_bboxes = None
665666
666667 if clear :
667668 self .clear ()
@@ -1338,14 +1339,22 @@ def _update_ticks(self, *, _use_cached=False):
13381339 self ._cached_ticks_to_draw = ticks_to_draw
13391340 return ticks_to_draw
13401341
1341- def _get_ticklabel_bboxes (self , ticks , renderer ):
1342+ def _get_ticklabel_bboxes (self , ticks , renderer , * , _use_cached = False ):
13421343 """Return lists of bboxes for ticks' label1's and label2's."""
1343- return ([tick .label1 .get_window_extent (renderer )
1344- for tick in ticks
1345- if tick .label1 .get_visible () and tick .label1 .get_in_layout ()],
1346- [tick .label2 .get_window_extent (renderer )
1347- for tick in ticks
1348- if tick .label2 .get_visible () and tick .label2 .get_in_layout ()])
1344+ # Return cached result if available and requested
1345+ if _use_cached and self ._cached_ticklabel_bboxes is not None :
1346+ return self ._cached_ticklabel_bboxes
1347+
1348+ result = ([tick .label1 .get_window_extent (renderer )
1349+ for tick in ticks
1350+ if tick .label1 .get_visible () and tick .label1 .get_in_layout ()],
1351+ [tick .label2 .get_window_extent (renderer )
1352+ for tick in ticks
1353+ if tick .label2 .get_visible () and tick .label2 .get_in_layout ()])
1354+
1355+ # Cache the result before returning
1356+ self ._cached_ticklabel_bboxes = result
1357+ return result
13491358
13501359 def get_tightbbox (self , renderer = None , * , for_layout_only = False ):
13511360 """
@@ -1369,7 +1378,8 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13691378 self ._update_label_position (renderer )
13701379
13711380 # go back to just this axis's tick labels
1372- tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer )
1381+ tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
1382+ _use_cached = False )
13731383
13741384 self ._update_offset_text_position (tlb1 , tlb2 )
13751385 self .offsetText .set_text (self .major .formatter .get_offset ())
@@ -1416,11 +1426,13 @@ def draw(self, renderer):
14161426 return
14171427 renderer .open_group (__name__ , gid = self .get_gid ())
14181428
1419- # Clear tick cache for this draw cycle
1429+ # Clear caches for this draw cycle
14201430 self ._cached_ticks_to_draw = None
1431+ self ._cached_ticklabel_bboxes = None
14211432
14221433 ticks_to_draw = self ._update_ticks (_use_cached = True )
1423- tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer )
1434+ tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
1435+ _use_cached = True )
14241436
14251437 for tick in ticks_to_draw :
14261438 tick .draw (renderer )
@@ -2257,7 +2269,8 @@ def _get_tick_boxes_siblings(self, renderer):
22572269 for ax in grouper .get_siblings (self .axes ):
22582270 axis = ax ._axis_map [name ]
22592271 ticks_to_draw = axis ._update_ticks (_use_cached = True )
2260- tlb , tlb2 = axis ._get_ticklabel_bboxes (ticks_to_draw , renderer )
2272+ tlb , tlb2 = axis ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
2273+ _use_cached = True )
22612274 bboxes .extend (tlb )
22622275 bboxes2 .extend (tlb2 )
22632276 return bboxes , bboxes2
0 commit comments