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

Skip to content

Commit 7b041fb

Browse files
Cache ticks each draw cycle
Fix test
1 parent 1a92dc9 commit 7b041fb

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
@@ -661,6 +661,8 @@ def __init__(self, axes, *, pickradius=15, clear=True):
661661
self._major_tick_kw = dict()
662662
self._minor_tick_kw = dict()
663663

664+
self._cached_ticks_to_draw = None
665+
664666
if clear:
665667
self.clear()
666668
else:
@@ -1278,11 +1280,15 @@ def _set_artist_props(self, a):
12781280
return
12791281
a.set_figure(self.get_figure(root=False))
12801282

1281-
def _update_ticks(self):
1283+
def _update_ticks(self, *, _use_cached=False):
12821284
"""
12831285
Update ticks (position and labels) using the current data interval of
12841286
the axes. Return the list of ticks that will be drawn.
12851287
"""
1288+
# Return cached result if available and requested
1289+
if _use_cached and self._cached_ticks_to_draw is not None:
1290+
return self._cached_ticks_to_draw
1291+
12861292
major_locs = self.get_majorticklocs()
12871293
major_labels = self.major.formatter.format_ticks(major_locs)
12881294
major_ticks = self.get_major_ticks(len(major_locs))
@@ -1328,6 +1334,8 @@ def _update_ticks(self):
13281334
if mtransforms._interval_contains_close(interval_t, loc_t):
13291335
ticks_to_draw.append(tick)
13301336

1337+
# Cache the result before returning
1338+
self._cached_ticks_to_draw = ticks_to_draw
13311339
return ticks_to_draw
13321340

13331341
def _get_ticklabel_bboxes(self, ticks, renderer):
@@ -1353,7 +1361,10 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13531361
return
13541362
if renderer is None:
13551363
renderer = self.get_figure(root=True)._get_renderer()
1356-
ticks_to_draw = self._update_ticks()
1364+
# Don't use cached values here - get_tightbbox() is called during
1365+
# layout calculations (e.g., constrained_layout) outside of draw(),
1366+
# and must always recalculate to reflect current state.
1367+
ticks_to_draw = self._update_ticks(_use_cached=False)
13571368

13581369
self._update_label_position(renderer)
13591370

@@ -1405,7 +1416,10 @@ def draw(self, renderer):
14051416
return
14061417
renderer.open_group(__name__, gid=self.get_gid())
14071418

1408-
ticks_to_draw = self._update_ticks()
1419+
# Clear tick cache for this draw cycle
1420+
self._cached_ticks_to_draw = None
1421+
1422+
ticks_to_draw = self._update_ticks(_use_cached=True)
14091423
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
14101424

14111425
for tick in ticks_to_draw:
@@ -2242,7 +2256,7 @@ def _get_tick_boxes_siblings(self, renderer):
22422256
# If we want to align labels from other Axes:
22432257
for ax in grouper.get_siblings(self.axes):
22442258
axis = ax._axis_map[name]
2245-
ticks_to_draw = axis._update_ticks()
2259+
ticks_to_draw = axis._update_ticks(_use_cached=True)
22462260
tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer)
22472261
bboxes.extend(tlb)
22482262
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)