How to set a single, main title above all the subplots with Pyplot? How to set a single, main title above all the subplots with Pyplot? python python

How to set a single, main title above all the subplots with Pyplot?


Use pyplot.suptitle or Figure.suptitle:

import matplotlib.pyplot as pltimport numpy as npfig=plt.figure()data=np.arange(900).reshape((30,30))for i in range(1,5):    ax=fig.add_subplot(2,2,i)            ax.imshow(data)fig.suptitle('Main title') # or plt.suptitle('Main title')plt.show()

enter image description here


A few points I find useful when applying this to my own plots:

  • I prefer the consistency of using fig.suptitle(title) rather than plt.suptitle(title)
  • When using fig.tight_layout() the title must be shifted with fig.subplots_adjust(top=0.88)
  • See answer below about fontsizes

Example code taken from subplots demo in matplotlib docs and adjusted with a master title.

A nice 4x4 plot

import matplotlib.pyplot as pltimport numpy as np# Simple data to display in various formsx = np.linspace(0, 2 * np.pi, 400)y = np.sin(x ** 2)fig, axarr = plt.subplots(2, 2)fig.suptitle("This Main Title is Nicely Formatted", fontsize=16)axarr[0, 0].plot(x, y)axarr[0, 0].set_title('Axis [0,0] Subtitle')axarr[0, 1].scatter(x, y)axarr[0, 1].set_title('Axis [0,1] Subtitle')axarr[1, 0].plot(x, y ** 2)axarr[1, 0].set_title('Axis [1,0] Subtitle')axarr[1, 1].scatter(x, y ** 2)axarr[1, 1].set_title('Axis [1,1] Subtitle')# # Fine-tune figure; hide x ticks for top plots and y ticks for right plotsplt.setp([a.get_xticklabels() for a in axarr[0, :]], visible=False)plt.setp([a.get_yticklabels() for a in axarr[:, 1]], visible=False)# Tight layout often produces nice results# but requires the title to be spaced accordinglyfig.tight_layout()fig.subplots_adjust(top=0.88)plt.show()


If your subplots also have titles, you may need to adjust the main title size:

plt.suptitle("Main Title", size=16)