@@ -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,20 @@ 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 :
4386- bbox = a .get_tightbbox (renderer )
4387- if (bbox is not None
4388- and 0 < bbox .width < np .inf
4389- and 0 < bbox .height < np .inf ):
4390- bb .append (bbox )
4391-
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_clip_bbox ()
4392+ if clip_extent is not None :
4393+ clip_extent = mtransforms .Bbox .intersection (clip_extent ,
4394+ axbbox )
4395+ inside_axes = np .all (clip_extent .extents == axbbox .extents )
4396+ if clip_extent is None or not inside_axes :
4397+ bbox = a .get_tightbbox (renderer )
4398+ if (bbox is not None
4399+ and 0 < bbox .width < np .inf
4400+ and 0 < bbox .height < np .inf ):
4401+ bb .append (bbox )
43924402 _bbox = mtransforms .Bbox .union (
43934403 [b for b in bb if b .width != 0 or b .height != 0 ])
43944404
0 commit comments