@@ -3149,19 +3149,31 @@ def draw(self, renderer=None, *args, **kwargs):
31493149 self ._colorbar_fill .update_ticks (manual_only = True ) # only if needed
31503150 if self ._inset_parent is not None and self ._inset_zoom :
31513151 self .indicate_inset_zoom ()
3152+ needs_inset_reflow = bool (getattr (self , "_inset_colorbar_needs_reflow" , False ))
3153+ has_inset_frame = bool (
3154+ getattr (self , "_inset_colorbar_frame" , None ) is not None
3155+ and getattr (self , "_inset_colorbar_obj" , None )
3156+ )
31523157 super ().draw (renderer , * args , ** kwargs )
3153- if getattr (self , "_inset_colorbar_obj" , None ) and getattr (
3154- self , "_inset_colorbar_needs_reflow" , False
3155- ):
3156- self ._inset_colorbar_needs_reflow = False
3158+ if has_inset_frame :
3159+ if not needs_inset_reflow :
3160+ needs_inset_reflow = _inset_colorbar_frame_needs_reflow (
3161+ self ._inset_colorbar_obj ,
3162+ labelloc = getattr (self , "_inset_colorbar_labelloc" , None ),
3163+ renderer = renderer ,
3164+ )
3165+ if has_inset_frame and needs_inset_reflow :
31573166 _reflow_inset_colorbar_frame (
31583167 self ._inset_colorbar_obj ,
31593168 labelloc = getattr (self , "_inset_colorbar_labelloc" , None ),
31603169 ticklen = getattr (
31613170 self , "_inset_colorbar_ticklen" , units (rc ["tick.len" ], "pt" )
31623171 ),
3172+ renderer = renderer ,
31633173 )
3164- self .figure .canvas .draw_idle ()
3174+ self ._inset_colorbar_needs_reflow = False
3175+ # Re-draw synchronously so the current render pass sees reflowed bounds.
3176+ super ().draw (renderer , * args , ** kwargs )
31653177
31663178 def get_tightbbox (self , renderer , * args , ** kwargs ):
31673179 # Perform extra post-processing steps
@@ -4581,11 +4593,71 @@ def _apply_inset_colorbar_layout(
45814593 frame .set_bounds (* bounds_frame )
45824594
45834595
4596+ def _inset_colorbar_frame_needs_reflow (colorbar , * , labelloc : str , renderer ) -> bool :
4597+ cax = colorbar .ax
4598+ layout = getattr (cax , "_inset_colorbar_layout" , None )
4599+ frame = getattr (cax , "_inset_colorbar_frame" , None )
4600+ if not layout or frame is None :
4601+ return False
4602+
4603+ orientation = layout ["orientation" ]
4604+ loc = layout ["loc" ]
4605+ ticklocation = layout ["ticklocation" ]
4606+ labelloc_layout = labelloc if isinstance (labelloc , str ) else ticklocation
4607+ bboxes = []
4608+
4609+ longaxis = _get_colorbar_long_axis (colorbar )
4610+ try :
4611+ bbox = longaxis .get_tightbbox (renderer )
4612+ except Exception :
4613+ bbox = None
4614+ if bbox is not None :
4615+ bboxes .append (bbox )
4616+
4617+ label_axis = _get_axis_for (
4618+ labelloc_layout , loc , orientation = orientation , ax = colorbar
4619+ )
4620+ if label_axis .label .get_text ():
4621+ try :
4622+ bboxes .append (label_axis .label .get_window_extent (renderer = renderer ))
4623+ except Exception :
4624+ pass
4625+
4626+ for artist in (
4627+ getattr (colorbar , "outline" , None ),
4628+ getattr (colorbar , "solids" , None ),
4629+ getattr (colorbar , "dividers" , None ),
4630+ ):
4631+ if artist is None :
4632+ continue
4633+ try :
4634+ bboxes .append (artist .get_window_extent (renderer = renderer ))
4635+ except Exception :
4636+ pass
4637+
4638+ if not bboxes :
4639+ return False
4640+
4641+ x0 = min (bbox .x0 for bbox in bboxes )
4642+ y0 = min (bbox .y0 for bbox in bboxes )
4643+ x1 = max (bbox .x1 for bbox in bboxes )
4644+ y1 = max (bbox .y1 for bbox in bboxes )
4645+ frame_bbox = frame .get_window_extent (renderer = renderer )
4646+ tol = 1.0
4647+ return (
4648+ frame_bbox .x0 > x0 + tol
4649+ or frame_bbox .y0 > y0 + tol
4650+ or frame_bbox .x1 < x1 - tol
4651+ or frame_bbox .y1 < y1 - tol
4652+ )
4653+
4654+
45844655def _reflow_inset_colorbar_frame (
45854656 colorbar ,
45864657 * ,
45874658 labelloc : str ,
45884659 ticklen : float ,
4660+ renderer = None ,
45894661):
45904662 cax = colorbar .ax
45914663 layout = getattr (cax , "_inset_colorbar_layout" , None )
@@ -4623,7 +4695,7 @@ def _reflow_inset_colorbar_frame(
46234695 cb_width = width
46244696 cb_height = length
46254697
4626- renderer = cax .figure ._get_renderer ()
4698+ renderer = renderer or cax .figure ._get_renderer ()
46274699 if hasattr (colorbar , "update_ticks" ):
46284700 colorbar .update_ticks (manual_only = True )
46294701 bboxes = []
0 commit comments