Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inconsistent alignment of title and suptitle in matplotlib

I'm trying to use both ax.set_title() and plt.suptitle() to incorporate a title and a subtitle to a graph, but the two seem to not share the same alignment. For example, the following:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

cats = ('One', 'Two')
vals = (12, 4) 

ax.barh(cats, vals, align='center')
plt.suptitle('Title')
ax.set_title('Title')
plt.show()

Gives us the following misaligned titles:

Misaligned titles with short y labels

How can I get these two titles to align properly? I thought it may be something to do with ax.title aligning to the axis and plt.suptitle aligning to the figure, but testing a much longer y label doesn't seem to affect the offset:

fig, ax = plt.subplots()

cats = ('One million tiny engines running at one hundred miles per hour', 'Two')
vals = (12, 4) 

ax.barh(cats, vals, align='center')
plt.suptitle('Title')
ax.set_title('Title')
plt.show()

Misaligned titles with long y label

like image 729
asongtoruin Avatar asked Oct 07 '19 19:10

asongtoruin


1 Answers

matplotlib aligns suptitle to the figure, and title to the subplot. You can manually jiggle the suptitle using fig.subplotpars:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

cats = ('One', 'Two')
vals = (12, 4) 

# Mid point of left and right x-positions
mid = (fig.subplotpars.right + fig.subplotpars.left)/2

ax.barh(cats, vals, align='center')
plt.suptitle('Title',x=mid)
ax.set_title('Title')
plt.show()

Fixed title

Enjoy!

like image 52
soyapencil Avatar answered Nov 15 '22 03:11

soyapencil