@@ -674,6 +674,7 @@ def __init__(self, axes, *, pickradius=15, clear=True):
674674 self ._minor_tick_kw = dict ()
675675
676676 self ._cached_ticks_to_draw = None
677+ self ._cached_ticklabel_bboxes = None
677678
678679 if clear :
679680 self .clear ()
@@ -1377,14 +1378,22 @@ def _update_ticks(self, *, _use_cached=False):
13771378 self ._cached_ticks_to_draw = ticks_to_draw
13781379 return ticks_to_draw
13791380
1380- def _get_ticklabel_bboxes (self , ticks , renderer ):
1381+ def _get_ticklabel_bboxes (self , ticks , renderer , * , _use_cached = False ):
13811382 """Return lists of bboxes for ticks' label1's and label2's."""
1382- return ([tick .label1 .get_window_extent (renderer )
1383- for tick in ticks
1384- if tick .label1 .get_visible () and tick .label1 .get_in_layout ()],
1385- [tick .label2 .get_window_extent (renderer )
1386- for tick in ticks
1387- if tick .label2 .get_visible () and tick .label2 .get_in_layout ()])
1383+ # Return cached result if available and requested
1384+ if _use_cached and self ._cached_ticklabel_bboxes is not None :
1385+ return self ._cached_ticklabel_bboxes
1386+
1387+ result = ([tick .label1 .get_window_extent (renderer )
1388+ for tick in ticks
1389+ if tick .label1 .get_visible () and tick .label1 .get_in_layout ()],
1390+ [tick .label2 .get_window_extent (renderer )
1391+ for tick in ticks
1392+ if tick .label2 .get_visible () and tick .label2 .get_in_layout ()])
1393+
1394+ # Cache the result before returning
1395+ self ._cached_ticklabel_bboxes = result
1396+ return result
13881397
13891398 def get_tightbbox (self , renderer = None , * , for_layout_only = False ):
13901399 """
@@ -1408,7 +1417,8 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
14081417 self ._update_label_position (renderer )
14091418
14101419 # go back to just this axis's tick labels
1411- tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer )
1420+ tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
1421+ _use_cached = False )
14121422
14131423 self ._update_offset_text_position (tlb1 , tlb2 )
14141424 self .offsetText .set_text (self .major .formatter .get_offset ())
@@ -1455,11 +1465,13 @@ def draw(self, renderer):
14551465 return
14561466 renderer .open_group (__name__ , gid = self .get_gid ())
14571467
1458- # Clear tick cache for this draw cycle
1468+ # Clear caches for this draw cycle
14591469 self ._cached_ticks_to_draw = None
1470+ self ._cached_ticklabel_bboxes = None
14601471
14611472 ticks_to_draw = self ._update_ticks (_use_cached = True )
1462- tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer )
1473+ tlb1 , tlb2 = self ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
1474+ _use_cached = True )
14631475
14641476 for tick in ticks_to_draw :
14651477 tick .draw (renderer )
@@ -2296,7 +2308,8 @@ def _get_tick_boxes_siblings(self, renderer):
22962308 for ax in grouper .get_siblings (self .axes ):
22972309 axis = ax ._axis_map [name ]
22982310 ticks_to_draw = axis ._update_ticks (_use_cached = True )
2299- tlb , tlb2 = axis ._get_ticklabel_bboxes (ticks_to_draw , renderer )
2311+ tlb , tlb2 = axis ._get_ticklabel_bboxes (ticks_to_draw , renderer ,
2312+ _use_cached = True )
23002313 bboxes .extend (tlb )
23012314 bboxes2 .extend (tlb2 )
23022315 return bboxes , bboxes2
0 commit comments