Вложенные графики в Matplotlib используются для размещения нескольких графиков в рамках одной фигуры. Каждый вложенный график размещается в сетке и представляет собой отдельное визуальное представление данных. Вложенные графики позволяют отображать связанную информацию рядом, облегчая сравнение и анализ. Matplotlib позволяет полностью контролировать размер, положение и расстояние между графиками.
Вложенные графики идеально подходят для сравнения различных наборов данных или аспектов данных. Например, мы можем визуализировать несколько переменных или временных рядов на отдельных вложенных графиках для удобного сравнения, вместо создания нескольких отдельных фигур для каждого графика.
Для удобного создания подграфиков одним вызовом Matplotlib предоставляет функцию matplotlib.pyplot.subplots(). Она очень полезна, когда надо представить несколько графиков в структурированном виде в рамках одной фигуры.
Создание фигуры и подграфика в общем случае выглядит следующим образом:
fig, axes = plt.subplots()
В данном случае мы получаем объект фигуры - fig и объект Axes, через который мы можем непосредственно строить график
Но при вызове plt.subplots() через параметры nrows и ncols также можно указать количество строк и столбцов сетки подграфиков:
fig, axes = plt.subplots(nrows=2, ncols=2)
Здесь возвращаемый объект axes теперь представляет собой массив объектов Axes, каждый из которых может использоваться для построения графиков в каждой ячейке сетки, образованной 2 строками и 2 столбцами.
Используя axes, мы можем получить доступ к каждому подграфику и манипулировать им с помощью индексации аналогично элементам списка:
axes[0, 0].plot(x, y) # Подграфик в верхнем левом углу axes[1, 1].plot(x, y) # Подграфик в нижнем правом углу
Если же надо, чтобы подграфики использовали одну и ту же ось x или y, можно установить параметры sharex или sharey в значение True:
fig, axes = plt.subplots(2, 2, sharex="col", sharey="row")
Это упрощает сравнение подграфиков друг с другом, поскольку масштабы осей будут одинаковыми
Как и в случае с одним графиком, мы можем использовать такие методы, как .plot(), .scatter(), .bar() и т.д., чтобы отображать данные в каждом объекте Axes:
axes[0, 0].plot(x, y)
При создании подграфиков наиболее распространенная проблема - настройка расстояния между ними. Для этого можно использовать функцию plt.subplots_adjust() или вызвов
figure.tight_layout(), которая автоматически регулирует расстояние, чтобы предотвратить перекрытие содержимого:
Функция subplots_adjust() принимает следующие параметры:
left: положение левого края подграфиков в процентах от ширины фигуры.
right: положение правого края подграфиков в процентах от ширины фигуры.
bottom: положение нижнего края подграфиков в процентах от высоты фигуры.
top: положение верхнего края подграфиков в процентах от высоты фигуры.
wspace: Ширина отступа между подграфиками в процентах от средней ширины осей.
hspace: Высота отступа между подграфиками в процентах от средней высоты осей.
Также к каждому подграфику можно добавить заголовки, метки и легенды:
axes[0, 0].set_title("Главный заголовок") axes[0, 0].set_xlabel("Метка X") axes[0, 0].set_ylabel("Метка Y") axes[0, 0].legend(["Набор данных 1"])Рассмотрим следующий пример:
import matplotlib.pyplot as plt
# создаем сетку 2x2 из 4 подграфиков
_ , axes = plt.subplots(2, 2)
# верхний левый угол - линейный график
axes[0, 0].plot([1, 2, 3], [3, 2, 1])
axes[0, 0].set_title("Line Plot")
# верхний правый угол - диаграмма рассеяния
axes[0, 1].scatter([1, 2, 3], [3, 2, 1])
axes[0, 1].set_title("Scatter Plot")
# нижний левый угол - столбцатая диаграмма
axes[1, 0].bar([1, 2, 3], [3, 2, 1])
axes[1, 0].set_title("Bar Plot")
# нижний правый угол - гистограмма
axes[1, 1].hist([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
axes[1, 1].set_title("Histogram")
# настраиваем расстояние между подграфиками
plt.tight_layout()
plt.show()
Здесь мы создаем сетку 2x2 из 4 подграфиков, где каждый подграфик представляет отдельный тип графика/диаграммы
Другой пример:
import matplotlib.pyplot as plt
# Примерные данные (возрастные группы и население в млн)
ages = ["0-4", "5-9", "10-14", "15-19", "20-24", "25-29", "30-34"]
males = [60, 58, 55, 52, 50, 48, 45]
females = [55, 53, 51, 49, 47, 45, 42]
_, axes = plt.subplots(ncols=2, sharey=True)
# Левая часть (Мужчины)
axes[0].barh(ages, males, color="royalblue", align="center")
axes[0].set_title("Мужчины")
axes[0].invert_xaxis() # Разворачиваем график влево
# Правая часть (Женщины)
axes[1].barh(ages, females, color="lightpink", align="center")
axes[1].set_title("Женщины")
# Убираем черточки (ticks) у правого графика
axes[1].tick_params(axis="y", length=0)
# Убираем лишнее пространство между осями
plt.subplots_adjust(wspace=0)
plt.show()
Здесь мы создаем условную возрастно-половую пирамиду на некоторым наборе тестовых данных в виде двух горизонтальных столбчатых графика (barh), расположенных "спина к спине".
Для создания подграфиков используется вызов plt.subplots(ncols=2, sharey=True), где ncols=2 говорит, что нам нужно два столбца, а настройка sharey=True
позволяет выполнить отрисовку двух симметричных графиков с общей вертикальной осью.
Чтобы "мужская" часть пирамиды смотрела влево, для левого подграфика используется метод axes[0].invert_xaxis() (в качестве альтернативы можно было бы сделать значения отрицательными):
И чтобы диаграммы лучше выглядили, настраивается оформление: убираются лишние отступы между графиками с помощью plt.subplots_adjust(wspace=0) и настраиваютсяе подписи осей.