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:

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()

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()

Enjoy!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With