Skip to content

Commit 2ed48b9

Browse files
Fix tests
1 parent d91da91 commit 2ed48b9

File tree

4 files changed

+39
-30
lines changed

4 files changed

+39
-30
lines changed

lib/matplotlib/axes/_base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3199,6 +3199,11 @@ def draw(self, renderer):
31993199

32003200
self._update_title_position(renderer)
32013201

3202+
# Clear axis tick caches for this draw cycle
3203+
for _axis in self._axis_map.values():
3204+
_axis._cached_ticks_to_draw = None
3205+
_axis._cached_ticklabel_bboxes = None
3206+
32023207
if not self.axison:
32033208
for _axis in self._axis_map.values():
32043209
artists.remove(_axis)

lib/matplotlib/axis.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,13 +1281,13 @@ def _set_artist_props(self, a):
12811281
return
12821282
a.set_figure(self.get_figure(root=False))
12831283

1284-
def _update_ticks(self, *, _use_cached=False):
1284+
def _update_ticks(self, *, _use_cache=False):
12851285
"""
12861286
Update ticks (position and labels) using the current data interval of
12871287
the axes. Return the list of ticks that will be drawn.
12881288
"""
12891289
# Return cached result if available and requested
1290-
if _use_cached and self._cached_ticks_to_draw is not None:
1290+
if _use_cache and self._cached_ticks_to_draw is not None:
12911291
return self._cached_ticks_to_draw
12921292

12931293
major_locs = self.get_majorticklocs()
@@ -1335,14 +1335,15 @@ def _update_ticks(self, *, _use_cached=False):
13351335
if mtransforms._interval_contains_close(interval_t, loc_t):
13361336
ticks_to_draw.append(tick)
13371337

1338-
# Cache the result before returning
1339-
self._cached_ticks_to_draw = ticks_to_draw
1338+
# Only cache the result when called from the draw path
1339+
if _use_cache:
1340+
self._cached_ticks_to_draw = ticks_to_draw
13401341
return ticks_to_draw
13411342

1342-
def _get_ticklabel_bboxes(self, ticks, renderer, *, _use_cached=False):
1343+
def _get_ticklabel_bboxes(self, ticks, renderer, *, _use_cache=False):
13431344
"""Return lists of bboxes for ticks' label1's and label2's."""
13441345
# Return cached result if available and requested
1345-
if _use_cached and self._cached_ticklabel_bboxes is not None:
1346+
if _use_cache and self._cached_ticklabel_bboxes is not None:
13461347
return self._cached_ticklabel_bboxes
13471348

13481349
result = ([tick.label1.get_window_extent(renderer)
@@ -1352,8 +1353,9 @@ def _get_ticklabel_bboxes(self, ticks, renderer, *, _use_cached=False):
13521353
for tick in ticks
13531354
if tick.label2.get_visible() and tick.label2.get_in_layout()])
13541355

1355-
# Cache the result before returning
1356-
self._cached_ticklabel_bboxes = result
1356+
# Only cache the result when called from the draw path
1357+
if _use_cache:
1358+
self._cached_ticklabel_bboxes = result
13571359
return result
13581360

13591361
def get_tightbbox(self, renderer=None, *, for_layout_only=False):
@@ -1373,13 +1375,13 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13731375
# Don't use cached values here - get_tightbbox() is called during
13741376
# layout calculations (e.g., constrained_layout) outside of draw(),
13751377
# and must always recalculate to reflect current state.
1376-
ticks_to_draw = self._update_ticks(_use_cached=False)
1378+
ticks_to_draw = self._update_ticks(_use_cache=False)
13771379

1378-
self._update_label_position(renderer)
1380+
self._update_label_position(renderer, _use_cache=False)
13791381

13801382
# go back to just this axis's tick labels
13811383
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer,
1382-
_use_cached=False)
1384+
_use_cache=False)
13831385

13841386
self._update_offset_text_position(tlb1, tlb2)
13851387
self.offsetText.set_text(self.major.formatter.get_offset())
@@ -1426,19 +1428,15 @@ def draw(self, renderer):
14261428
return
14271429
renderer.open_group(__name__, gid=self.get_gid())
14281430

1429-
# Clear caches for this draw cycle
1430-
self._cached_ticks_to_draw = None
1431-
self._cached_ticklabel_bboxes = None
1432-
1433-
ticks_to_draw = self._update_ticks(_use_cached=True)
1431+
ticks_to_draw = self._update_ticks(_use_cache=True)
14341432
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer,
1435-
_use_cached=True)
1433+
_use_cache=True)
14361434

14371435
for tick in ticks_to_draw:
14381436
tick.draw(renderer)
14391437

14401438
# Shift label away from axes to avoid overlapping ticklabels.
1441-
self._update_label_position(renderer)
1439+
self._update_label_position(renderer, _use_cache=True)
14421440
self.label.draw(renderer)
14431441

14441442
self._update_offset_text_position(tlb1, tlb2)
@@ -1448,6 +1446,10 @@ def draw(self, renderer):
14481446
renderer.close_group(__name__)
14491447
self.stale = False
14501448

1449+
# Reset cached values for next draw cycle, in case not called by Axes.draw()
1450+
self._cached_ticks_to_draw = None
1451+
self._cached_ticklabel_bboxes = None
1452+
14511453
def get_gridlines(self):
14521454
r"""Return this Axis' grid lines as a list of `.Line2D`\s."""
14531455
ticks = self.get_major_ticks()
@@ -2251,7 +2253,7 @@ def set_ticks(self, ticks, labels=None, *, minor=False, **kwargs):
22512253
self.set_ticklabels(labels, minor=minor, **kwargs)
22522254
return result
22532255

2254-
def _get_tick_boxes_siblings(self, renderer):
2256+
def _get_tick_boxes_siblings(self, renderer, *, _use_cache=False):
22552257
"""
22562258
Get the bounding boxes for this `.axis` and its siblings
22572259
as set by `.Figure.align_xlabels` or `.Figure.align_ylabels`.
@@ -2268,14 +2270,14 @@ def _get_tick_boxes_siblings(self, renderer):
22682270
# If we want to align labels from other Axes:
22692271
for ax in grouper.get_siblings(self.axes):
22702272
axis = ax._axis_map[name]
2271-
ticks_to_draw = axis._update_ticks(_use_cached=True)
2273+
ticks_to_draw = axis._update_ticks(_use_cache=_use_cache)
22722274
tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer,
2273-
_use_cached=True)
2275+
_use_cache=_use_cache)
22742276
bboxes.extend(tlb)
22752277
bboxes2.extend(tlb2)
22762278
return bboxes, bboxes2
22772279

2278-
def _update_label_position(self, renderer):
2280+
def _update_label_position(self, renderer, *, _use_cache=False):
22792281
"""
22802282
Update the label position based on the bounding box enclosing
22812283
all the ticklabels and axis spine.
@@ -2472,7 +2474,7 @@ def set_label_position(self, position):
24722474
self.label_position = position
24732475
self.stale = True
24742476

2475-
def _update_label_position(self, renderer):
2477+
def _update_label_position(self, renderer, *, _use_cache=False):
24762478
"""
24772479
Update the label position based on the bounding box enclosing
24782480
all the ticklabels and axis spine
@@ -2482,7 +2484,8 @@ def _update_label_position(self, renderer):
24822484

24832485
# get bounding boxes for this axis and any siblings
24842486
# that have been set by `fig.align_xlabels()`
2485-
bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer)
2487+
bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer,
2488+
_use_cache=_use_cache)
24862489
x, y = self.label.get_position()
24872490

24882491
if self.label_position == 'bottom':
@@ -2699,7 +2702,7 @@ def set_label_position(self, position):
26992702
self.label_position = position
27002703
self.stale = True
27012704

2702-
def _update_label_position(self, renderer):
2705+
def _update_label_position(self, renderer, *, _use_cache=False):
27032706
"""
27042707
Update the label position based on the bounding box enclosing
27052708
all the ticklabels and axis spine
@@ -2709,7 +2712,8 @@ def _update_label_position(self, renderer):
27092712

27102713
# get bounding boxes for this axis and any siblings
27112714
# that have been set by `fig.align_ylabels()`
2712-
bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer)
2715+
bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer,
2716+
_use_cache=_use_cache)
27132717
x, y = self.label.get_position()
27142718

27152719
if self.label_position == 'left':

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(_use_cached=True)
158+
drawn_ticks = self.axis._update_ticks(_use_cache=True)
159159

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

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ def _axmask(self):
435435

436436
def _draw_ticks(self, renderer, edgep1, centers, deltas, highs,
437437
deltas_per_point, pos):
438-
ticks = self._update_ticks(_use_cached=True)
438+
ticks = self._update_ticks(_use_cache=True)
439439
info = self._axinfo
440440
index = info["i"]
441441
juggled = info["juggled"]
@@ -640,7 +640,7 @@ def draw_grid(self, renderer):
640640

641641
renderer.open_group("grid3d", gid=self.get_gid())
642642

643-
ticks = self._update_ticks(_use_cached=True)
643+
ticks = self._update_ticks(_use_cache=True)
644644
if len(ticks):
645645
# Get general axis information:
646646
info = self._axinfo
@@ -712,7 +712,7 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
712712
# Don't use cached values here - get_tightbbox() is called during
713713
# layout calculations (e.g., constrained_layout) outside of draw(),
714714
# and must always recalculate to reflect current state.
715-
bb_1, bb_2 = self._get_ticklabel_bboxes(ticks, renderer, _use_cached=False)
715+
bb_1, bb_2 = self._get_ticklabel_bboxes(ticks, renderer, _use_cache=False)
716716
other = []
717717

718718
if self.offsetText.get_visible() and self.offsetText.get_text():

0 commit comments

Comments
 (0)