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

Skip to content

Commit 614a3dc

Browse files
Cache ticklabel bboxes each draw cycle
1 parent 34838c0 commit 614a3dc

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()
@@ -1350,14 +1351,22 @@ def _update_ticks(self, *, _use_cached=False):
13501351
self._cached_ticks_to_draw = ticks_to_draw
13511352
return ticks_to_draw
13521353

1353-
def _get_ticklabel_bboxes(self, ticks, renderer):
1354+
def _get_ticklabel_bboxes(self, ticks, renderer, *, _use_cached=False):
13541355
"""Return lists of bboxes for ticks' label1's and label2's."""
1355-
return ([tick.label1.get_window_extent(renderer)
1356-
for tick in ticks
1357-
if tick.label1.get_visible() and tick.label1.get_in_layout()],
1358-
[tick.label2.get_window_extent(renderer)
1359-
for tick in ticks
1360-
if tick.label2.get_visible() and tick.label2.get_in_layout()])
1356+
# Return cached result if available and requested
1357+
if _use_cached and self._cached_ticklabel_bboxes is not None:
1358+
return self._cached_ticklabel_bboxes
1359+
1360+
result = ([tick.label1.get_window_extent(renderer)
1361+
for tick in ticks
1362+
if tick.label1.get_visible() and tick.label1.get_in_layout()],
1363+
[tick.label2.get_window_extent(renderer)
1364+
for tick in ticks
1365+
if tick.label2.get_visible() and tick.label2.get_in_layout()])
1366+
1367+
# Cache the result before returning
1368+
self._cached_ticklabel_bboxes = result
1369+
return result
13611370

13621371
def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13631372
"""
@@ -1381,7 +1390,8 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13811390
self._update_label_position(renderer)
13821391

13831392
# go back to just this axis's tick labels
1384-
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
1393+
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer,
1394+
_use_cached=False)
13851395

13861396
self._update_offset_text_position(tlb1, tlb2)
13871397
self.offsetText.set_text(self.major.formatter.get_offset())
@@ -1428,11 +1438,13 @@ def draw(self, renderer):
14281438
return
14291439
renderer.open_group(__name__, gid=self.get_gid())
14301440

1431-
# Clear tick cache for this draw cycle
1441+
# Clear caches for this draw cycle
14321442
self._cached_ticks_to_draw = None
1443+
self._cached_ticklabel_bboxes = None
14331444

14341445
ticks_to_draw = self._update_ticks(_use_cached=True)
1435-
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
1446+
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer,
1447+
_use_cached=True)
14361448

14371449
for tick in ticks_to_draw:
14381450
tick.draw(renderer)
@@ -2269,7 +2281,8 @@ def _get_tick_boxes_siblings(self, renderer):
22692281
for ax in grouper.get_siblings(self.axes):
22702282
axis = ax._axis_map[name]
22712283
ticks_to_draw = axis._update_ticks(_use_cached=True)
2272-
tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer)
2284+
tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer,
2285+
_use_cached=True)
22732286
bboxes.extend(tlb)
22742287
bboxes2.extend(tlb2)
22752288
return bboxes, bboxes2

0 commit comments

Comments
 (0)