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

Skip to content

Commit 3fe6b24

Browse files
Cache ticklabel bboxes each draw cycle
1 parent 64fef47 commit 3fe6b24

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
@@ -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

Comments
 (0)