From 5c2a0ec26683de9508d9138c9079b8ccc3bd19ed Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 27 May 2024 12:46:23 +0200 Subject: [PATCH] Factor out handling of missing spines in alignment calculations. ... by using spines.get. Note that for an Axes, get_window_extent (with or without the renderer argument) is always equal to ax.bbox; the refactoring also makes that symmetry clearer. --- lib/matplotlib/axes/_base.py | 7 ++-- lib/matplotlib/axis.py | 67 ++++++++++-------------------------- 2 files changed, 20 insertions(+), 54 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 0164f4e11169..2d785834aab1 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -3007,11 +3007,8 @@ def _update_title_position(self, renderer): or ax.xaxis.get_label_position() == 'top'): bb = ax.xaxis.get_tightbbox(renderer) if bb is None: - if 'outline' in ax.spines: - # Special case for colorbars: - bb = ax.spines['outline'].get_window_extent() - else: - bb = ax.get_window_extent(renderer) + # Extent of the outline for colorbars, of the axes otherwise. + bb = ax.spines.get("outline", ax).get_window_extent() top = max(top, bb.ymax) if title.get_text(): ax.yaxis.get_tightbbox(renderer) # update offsetText diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index d317f6ec0567..921de9271be8 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -2400,34 +2400,18 @@ def _update_label_position(self, renderer): # get bounding boxes for this axis and any siblings # that have been set by `fig.align_xlabels()` bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer) - x, y = self.label.get_position() + if self.label_position == 'bottom': - try: - spine = self.axes.spines['bottom'] - spinebbox = spine.get_window_extent() - except KeyError: - # use Axes if spine doesn't exist - spinebbox = self.axes.bbox - bbox = mtransforms.Bbox.union(bboxes + [spinebbox]) - bottom = bbox.y0 - - self.label.set_position( - (x, bottom - self.labelpad * self.figure.dpi / 72) - ) + # Union with extents of the bottom spine if present, of the axes otherwise. + bbox = mtransforms.Bbox.union([ + *bboxes, self.axes.spines.get("bottom", self.axes).get_window_extent()]) + self.label.set_position((x, bbox.y0 - self.labelpad * self.figure.dpi / 72)) else: - try: - spine = self.axes.spines['top'] - spinebbox = spine.get_window_extent() - except KeyError: - # use Axes if spine doesn't exist - spinebbox = self.axes.bbox - bbox = mtransforms.Bbox.union(bboxes2 + [spinebbox]) - top = bbox.y1 - - self.label.set_position( - (x, top + self.labelpad * self.figure.dpi / 72) - ) + # Union with extents of the top spine if present, of the axes otherwise. + bbox = mtransforms.Bbox.union([ + *bboxes2, self.axes.spines.get("top", self.axes).get_window_extent()]) + self.label.set_position((x, bbox.y1 + self.labelpad * self.figure.dpi / 72)) def _update_offset_text_position(self, bboxes, bboxes2): """ @@ -2642,32 +2626,17 @@ def _update_label_position(self, renderer): # that have been set by `fig.align_ylabels()` bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer) x, y = self.label.get_position() - if self.label_position == 'left': - try: - spine = self.axes.spines['left'] - spinebbox = spine.get_window_extent() - except KeyError: - # use Axes if spine doesn't exist - spinebbox = self.axes.bbox - bbox = mtransforms.Bbox.union(bboxes + [spinebbox]) - left = bbox.x0 - self.label.set_position( - (left - self.labelpad * self.figure.dpi / 72, y) - ) + if self.label_position == 'left': + # Union with extents of the left spine if present, of the axes otherwise. + bbox = mtransforms.Bbox.union([ + *bboxes, self.axes.spines.get("left", self.axes).get_window_extent()]) + self.label.set_position((bbox.x0 - self.labelpad * self.figure.dpi / 72, y)) else: - try: - spine = self.axes.spines['right'] - spinebbox = spine.get_window_extent() - except KeyError: - # use Axes if spine doesn't exist - spinebbox = self.axes.bbox - - bbox = mtransforms.Bbox.union(bboxes2 + [spinebbox]) - right = bbox.x1 - self.label.set_position( - (right + self.labelpad * self.figure.dpi / 72, y) - ) + # Union with extents of the right spine if present, of the axes otherwise. + bbox = mtransforms.Bbox.union([ + *bboxes2, self.axes.spines.get("right", self.axes).get_window_extent()]) + self.label.set_position((bbox.x1 + self.labelpad * self.figure.dpi / 72, y)) def _update_offset_text_position(self, bboxes, bboxes2): """