@@ -4292,6 +4292,7 @@ def get_default_bbox_extra_artists(self):
42924292 """
42934293
42944294 artists = self .get_children ()
4295+
42954296 if not (self .axison and self ._frameon ):
42964297 # don't do bbox on spines if frame not on.
42974298 for spine in self .spines .values ():
@@ -4366,7 +4367,8 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
43664367 bb .append (bb_yaxis )
43674368
43684369 self ._update_title_position (renderer )
4369- bb .append (self .get_window_extent (renderer ))
4370+ axbbox = self .get_window_extent (renderer )
4371+ bb .append (axbbox )
43704372
43714373 self ._update_title_position (renderer )
43724374 if self .title .get_visible ():
@@ -4383,12 +4385,22 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
43834385 bbox_artists = self .get_default_bbox_extra_artists ()
43844386
43854387 for a in bbox_artists :
4388+ # Extra check here to quickly see if clipping is on and
4389+ # contained in the axes. If it is, don't get the tightbbox for
4390+ # this artist because this can be expensive:
4391+ clip_extent = a ._get_clipping_extent_bbox ()
4392+ if clip_extent is not None :
4393+ clip_extent = mtransforms .Bbox .intersection (clip_extent ,
4394+ axbbox )
4395+ if np .all (clip_extent .extents == axbbox .extents ):
4396+ # clip extent is inside the axes bbox so don't check
4397+ # this artist
4398+ continue
43864399 bbox = a .get_tightbbox (renderer )
43874400 if (bbox is not None
43884401 and 0 < bbox .width < np .inf
43894402 and 0 < bbox .height < np .inf ):
43904403 bb .append (bbox )
4391-
43924404 _bbox = mtransforms .Bbox .union (
43934405 [b for b in bb if b .width != 0 or b .height != 0 ])
43944406
0 commit comments