Skip to content

Commit ebb6aa7

Browse files
authored
Merge pull request #11502 from jklymak/fix-title-bottom-vs-baseline
FIX: move title(s) up if subscripts hang too low.
2 parents 828468d + e38c544 commit ebb6aa7

File tree

9 files changed

+257
-209
lines changed

9 files changed

+257
-209
lines changed

lib/matplotlib/axes/_base.py

+32-16
Original file line numberDiff line numberDiff line change
@@ -2500,34 +2500,50 @@ def _update_title_position(self, renderer):
25002500
x, y = title.get_position()
25012501
if not np.isclose(y, 1.0):
25022502
self._autotitlepos = False
2503-
_log.debug('not adjusting title pos because title was'
2503+
_log.debug('not adjusting title pos because a title was'
25042504
' already placed manually: %f', y)
25052505
return
25062506
self._autotitlepos = True
25072507

2508+
ymax = -10
25082509
for title in titles:
25092510
x, y0 = title.get_position()
2510-
y = 1.0
2511+
y = 1
2512+
# need to start again in case of window resizing
2513+
title.set_position((x, 1.0))
25112514
# need to check all our twins too...
25122515
axs = self._twinned_axes.get_siblings(self)
25132516

2517+
top = 0 # the top of all the axes twinned with this axes...
25142518
for ax in axs:
25152519
try:
25162520
if (ax.xaxis.get_label_position() == 'top'
25172521
or ax.xaxis.get_ticks_position() == 'top'):
25182522
bb = ax.xaxis.get_tightbbox(renderer)
2519-
top = bb.ymax
2520-
# we don't need to pad because the padding is already
2521-
# in __init__: titleOffsetTrans
2522-
yn = self.transAxes.inverted().transform((0., top))[1]
2523-
y = max(y, yn)
2523+
else:
2524+
bb = ax.get_window_extent(renderer)
2525+
top = max(top, bb.ymax)
25242526
except AttributeError:
2525-
pass
2526-
2527-
title.set_position((x, y))
2527+
# this happens for an empty bb
2528+
y = 1
2529+
if title.get_window_extent(renderer).ymin < top:
2530+
y = self.transAxes.inverted().transform(
2531+
(0., top))[1]
2532+
title.set_position((x, y))
2533+
# emperically, this doesn't always get the min to top,
2534+
# so we need to adjust again.
2535+
if title.get_window_extent(renderer).ymin < top:
2536+
y = self.transAxes.inverted().transform(
2537+
(0., 2 * top -
2538+
title.get_window_extent(renderer).ymin))[1]
2539+
title.set_position((x, y))
2540+
ymax = max(y, ymax)
2541+
for title in titles:
2542+
# now line up all the titles at the highest baseline.
2543+
x, y0 = title.get_position()
2544+
title.set_position((x, ymax))
25282545

25292546
# Drawing
2530-
25312547
@allow_rasterization
25322548
def draw(self, renderer=None, inframe=False):
25332549
"""Draw everything (plot lines, axes, labels)"""
@@ -4201,19 +4217,19 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
42014217
if bb_xaxis:
42024218
bb.append(bb_xaxis)
42034219

4204-
self._update_title_position(renderer)
4205-
bb.append(self.get_window_extent(renderer))
4220+
bb_yaxis = self.yaxis.get_tightbbox(renderer)
4221+
if bb_yaxis:
4222+
bb.append(bb_yaxis)
42064223

4224+
self._update_title_position(renderer)
42074225
if self.title.get_visible():
42084226
bb.append(self.title.get_window_extent(renderer))
42094227
if self._left_title.get_visible():
42104228
bb.append(self._left_title.get_window_extent(renderer))
42114229
if self._right_title.get_visible():
42124230
bb.append(self._right_title.get_window_extent(renderer))
42134231

4214-
bb_yaxis = self.yaxis.get_tightbbox(renderer)
4215-
if bb_yaxis:
4216-
bb.append(bb_yaxis)
4232+
bb.append(self.get_window_extent(renderer))
42174233

42184234
bbox_artists = bbox_extra_artists
42194235
if bbox_artists is None:
Binary file not shown.

0 commit comments

Comments
 (0)