8000 Merge pull request #14445 from jklymak/fix-fastpath-clipped-artists · matplotlib/matplotlib@8555717 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8555717

Browse files
authored
Merge pull request #14445 from jklymak/fix-fastpath-clipped-artists
FIX: fastpath clipped artists
2 parents 0fc655a + 2eb6772 commit 8555717

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

lib/matplotlib/artist.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,23 @@ def get_window_extent(self, renderer):
249249
"""
250250
return Bbox([[0, 0], [0, 0]])
251251

252+
def _get_clipping_extent_bbox(self):
253+
"""
254+
Return a bbox with the extents of the intersection of the clip_path
255+
and clip_box for this artist, or None if both of these are
256+
None, or ``get_clip_on`` is False.
257+
"""
258+
bbox = None
259+
if self.get_clip_on():
260+
clip_box = self.get_clip_box()
261+
if clip_box is not None:
262+
bbox = clip_box
263+
clip_path = self.get_clip_path()
264+
if clip_path is not None and bbox is not None:
265+
clip_path = clip_path.get_fully_transformed_path()
266+
bbox = Bbox.intersection(bbox, clip_path.get_extents())
267+
return bbox
268+
252269
def get_tightbbox(self, renderer):
253270
"""
254271
Like `Artist.get_window_extent`, but includes any clipping.

lib/matplotlib/axes/_base.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4284,6 +4284,7 @@ def get_default_bbox_extra_artists(self):
42844284
"""
42854285

42864286
artists = self.get_children()
4287+
42874288
if not (self.axison and self._frameon):
42884289
# don't do bbox on spines if frame not on.
42894290
for spine in self.spines.values():
@@ -4358,7 +4359,8 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
43584359
bb.append(bb_yaxis)
43594360

43604361
self._update_title_position(renderer)
4361-
bb.append(self.get_window_extent(renderer))
4362+
axbbox = self.get_window_extent(renderer)
4363+
bb.append(axbbox)
43624364

43634365
self._update_title_position(renderer)
43644366
if self.title.get_visible():
@@ -4375,12 +4377,22 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
43754377
bbox_artists = self.get_default_bbox_extra_artists()
43764378

43774379
for a in bbox_artists:
4380+
# Extra check here to quickly see if clipping is on and
4381+
# contained in the axes. If it is, don't get the tightbbox for
4382+
# this artist because this can be expensive:
4383+
clip_extent = a._get_clipping_extent_bbox()
4384+
if clip_extent is not None:
4385+
clip_extent = mtransforms.Bbox.intersection(clip_extent,
4386+
axbbox)
4387+
if np.all(clip_extent.extents == axbbox.extents):
4388+
# clip extent is inside the axes bbox so don't check
4389+
# this artist
4390+
continue
43784391
bbox = a.get_tightbbox(renderer)
43794392
if (bbox is not None
43804393
and 0 < bbox.width < np.inf
43814394
and 0 < bbox.height < np.inf):
43824395
bb.append(bbox)
4383-
43844396
_bbox = mtransforms.Bbox.union(
43854397
[b for b in bb if b.width != 0 or b.height != 0])
43864398

0 commit comments

Comments
 (0)
0