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

Skip to content

Commit 34838c0

Browse files
Cache ticks each draw cycle
Fix test
1 parent 9abdac2 commit 34838c0

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

lib/matplotlib/axis.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ def __init__(self, axes, *, pickradius=15, clear=True):
673673
self._major_tick_kw = dict()
674674
self._minor_tick_kw = dict()
675675

676+
self._cached_ticks_to_draw = None
677+
676678
if clear:
677679
self.clear()
678680
else:
@@ -1290,11 +1292,15 @@ def _set_artist_props(self, a):
12901292
return
12911293
a.set_figure(self.get_figure(root=False))
12921294

1293-
def _update_ticks(self):
1295+
def _update_ticks(self, *, _use_cached=False):
12941296
"""
12951297
Update ticks (position and labels) using the current data interval of
12961298
the axes. Return the list of ticks that will be drawn.
12971299
"""
1300+
# Return cached result if available and requested
1301+
if _use_cached and self._cached_ticks_to_draw is not None:
1302+
return self._cached_ticks_to_draw
1303+
12981304
major_locs = self.get_majorticklocs()
12991305
major_labels = self.major.formatter.format_ticks(major_locs)
13001306
major_ticks = self.get_major_ticks(len(major_locs))
@@ -1340,6 +1346,8 @@ def _update_ticks(self):
13401346
if mtransforms._interval_contains_close(interval_t, loc_t):
13411347
ticks_to_draw.append(tick)
13421348

1349+
# Cache the result before returning
1350+
self._cached_ticks_to_draw = ticks_to_draw
13431351
return ticks_to_draw
13441352

13451353
def _get_ticklabel_bboxes(self, ticks, renderer):
@@ -1365,7 +1373,10 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13651373
return
13661374
if renderer is None:
13671375
renderer = self.get_figure(root=True)._get_renderer()
1368-
ticks_to_draw = self._update_ticks()
1376+
# Don't use cached values here - get_tightbbox() is called during
1377+
# layout calculations (e.g., constrained_layout) outside of draw(),
1378+
# and must always recalculate to reflect current state.
1379+
ticks_to_draw = self._update_ticks(_use_cached=False)
13691380

13701381
self._update_label_position(renderer)
13711382

@@ -1417,7 +1428,10 @@ def draw(self, renderer):
14171428
return
14181429
renderer.open_group(__name__, gid=self.get_gid())
14191430

1420-
ticks_to_draw = self._update_ticks()
1431+
# Clear tick cache for this draw cycle
1432+
self._cached_ticks_to_draw = None
1433+
1434+
ticks_to_draw = self._update_ticks(_use_cached=True)
14211435
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
14221436

14231437
for tick in ticks_to_draw:
@@ -2254,7 +2268,7 @@ def _get_tick_boxes_siblings(self, renderer):
22542268
# If we want to align labels from other Axes:
22552269
for ax in grouper.get_siblings(self.axes):
22562270
axis = ax._axis_map[name]
2257-
ticks_to_draw = axis._update_ticks()
2271+
ticks_to_draw = axis._update_ticks(_use_cached=True)
22582272
tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer)
22592273
bboxes.extend(tlb)
22602274
bboxes2.extend(tlb2)

lib/matplotlib/spines.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def get_window_extent(self, renderer=None):
155155
if self.axis is None or not self.axis.get_visible():
156156
return bb
157157
bboxes = [bb]
158-
drawn_ticks = self.axis._update_ticks()
158+
drawn_ticks = self.axis._update_ticks(_use_cached=True)
159159

160160
major_tick = next(iter({*drawn_ticks} & {*self.axis.majorTicks}), None)
161161
minor_tick = next(iter({*drawn_ticks} & {*self.axis.minorTicks}), None)

0 commit comments

Comments
 (0)