Раздел «Язык Си».PythonGraphsSubplots:

Несколько областей графиков

По умолчанию создаётся одно графическое окно figure(1) и одна графическая область subplot(111) в этом окне.

Команда subplot позволяет разбить графическое окно на несколько областей.

Она имеет три параметра: nrows, ncols, nplot.
nrows - количество строк;
ncols - количество столбцов;
nplot - номер области (от 1 до nrows*ncols).

Если nrows*ncols<10, то можно писать без запятой nrows, ncols, nplot.
Можно subplot(2,2,1), а можно subplot(221).

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 10.01, 0.01)  # от -10 до 10.01 с шагом 0.01 (>1000 точек)
t = np.arange(-10, 11, 1)   # от -10 до 11 с шагом 1 (20 точек)

fig = plt.figure()

#subplot 1
plt.subplot(221)            # первая область
plt.plot(x, np.sin(x))      # sin(x) на [-10, 10] цветом по умолчанию
plt.title(r'$\sin(x)$')     # заголовок "sin(x)"
plt.grid(True)              # рисовать решетку

#subplot 2
plt.subplot(222)            # вторая область
plt.plot(x, np.cos(x), 'g') # cos(x) на [-10, 10] зеленая линия
plt.axis('equal')           # одинаковый масштаб по осям Х и Y
plt.grid(True)              # рисовать решетку
plt.title(r'$\cos(x)$')     # заголовок "cos(x)"

#subplot 3
plt.subplot(223)            # третья область
plt.plot(x, x**2, t, t**2, 'ro') # 2 графика, первый линией, второй красными кругами
plt.title(r'$x^2$')         # заголовок "x2"
                            # решетки нет

#subplot 4
plt.subplot(224)            # четвертая область
plt.plot(x, x)              # прямая y=x
                            # оси с подписями нарисовать
                            # левую в центре
plt.subplot(224).spines['left'].set_position('center')
                            # нижнюю в центре
plt.subplot(224).spines['bottom'].set_position('center')
plt.title(r'$x$')           # заголовок "x"

plt.show()
fig.savefig('2.png')

Вариант с squeeze=False

Можно обращаться ax[0,0], ax[0,1], ax[1,0], ax[1,1], если вызвать subplots с параметром squeeze=False

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 10.01, 0.01)  # от -10 до 10.01 с шагом 0.01 (>1000 точек)
t = np.arange(-10, 11, 1)   # от -10 до 11 с шагом 1 (20 точек)

fig, ax = plt.subplots(2, 2, figsize=(8,8), sharex=True, squeeze=False)
                                # sharex=True общие оси Х для верхних и нижних графиков,
                                # но оси У для правых и левых графиков - разные
                                # squeeze=False возвращает массив осей ax, 
                                # обращаемся ax[0,0], ax[0,1], ax[1,0], ax[1,1]

#subplot 1
ax[0,0].plot(x, np.sin(x))      # sin(x) на [-10, 10] цветом по умолчанию
ax[0,0].set_title(r'$\sin(x)$') # заголовок "sin(x)"
ax[0,0].grid(True)              # рисовать решетку

#subplot 2
ax[0,1].plot(x, np.cos(x), 'g') # cos(x) на [-10, 10] зеленая линия
ax[0,1].axis('equal')           # одинаковый масштаб по осям Х и Y
ax[0,1].grid(True)              # рисовать решетку
ax[0,1].set_title(r'$\cos(x)$') # заголовок "cos(x)"

#subplot 3
ax[1,0].plot(x, x**2, t, t**2, 'ro') # 2 графика, первый линией, второй красными кругами
ax[1,0].set_title(r'$x^2$')     # заголовок "x2"
                                # решетки нет

#subplot 4
ax[1,1].plot(x, x)              # прямая y=x
                                # оси с подписями нарисовать
                                # левую в центре
ax[1,1].spines['left'].set_position('center')
                                # нижнюю в центре
ax[1,1].spines['bottom'].set_position('center')
ax[1,1].set_title(r'$x$')       # заголовок "x"

ax[1, 0].set_xlabel("x")        # подписи у осей (не все графики)
ax[0, 0].set_ylabel("y")
ax[1, 0].set_ylabel("y")

# красиво расположить области с отступами 
plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95, wspace=0.1,
hspace=0.2)

plt.show()
fig.savefig('2a.png')