Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 777feb6

Browse files
Cache ticklabel bboxes each draw cycle
1 parent 7b041fb commit 777feb6

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

lib/matplotlib/axis.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)