Matplotlib – мощная библиотека Python для визуализации данных. Одна из частых задач – создание нескольких графиков (подграфиков) в одной фигуре. При этом возникает необходимость объединить метки оси Y, чтобы сделать визуализацию более понятной и профессиональной. В этой статье мы рассмотрим различные способы реализации общей метки оси Y для подграфиков в Matplotlib, от базовых до продвинутых техник.
Основы работы с подграфиками в Matplotlib
Создание сетки подграфиков с помощью plt.subplots()
Функция plt.subplots() – основной инструмент для создания сетки подграфиков. Она возвращает объект Figure и массив объектов Axes, представляющих каждый подграфик.
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
# axes - это numpy array, содержащий объекты Axes
Базовое размещение и настройка отдельных подграфиков
После создания сетки подграфиков можно обращаться к каждому из них по индексу и настраивать его индивидуально.
axes[0, 0].plot([1, 2, 3], [4, 5, 6]) # Верхний левый подграфик
axes[0, 1].scatter([1, 2, 3], [7, 8, 9]) # Верхний правый подграфик
axes[1, 0].bar([1, 2, 3], [10, 11, 12]) # Нижний левый подграфик
axes[1, 1].hist([13, 14, 15]) # Нижний правый подграфик
plt.show()
Реализация общей метки оси Y
Метод fig.text() для добавления общей метки
Один из способов добавления общей метки оси Y – использование метода fig.text(). Он позволяет разместить текст в произвольной точке фигуры, независимо от подграфиков.
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=1, sharey=True)
axes[0].plot([1, 2, 3], [4, 5, 6])
axes[1].plot([1, 2, 3], [7, 8, 9])
fig.text(0.04, 0.5, 'Общая метка оси Y', va='center', rotation='vertical')
plt.show()
sharey=True задает общую ось Y для подграфиков.
Использование plt.ylabel() с отключением меток на отдельных графиках
Можно установить метку оси Y только для одного из подграфиков (например, для первого) и отключить метки для остальных, эффективно создавая видимость общей метки.
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=1, sharey=True)
axes[0].plot([1, 2, 3], [4, 5, 6])
axes[1].plot([1, 2, 3], [7, 8, 9])
axes[0].set_ylabel('Общая метка оси Y')
for ax in axes[1:]: # Пропускаем первый подграфик
ax.set_ylabel('') # Убираем подписи для других графиков
plt.show()
Продвинутые техники и настройка
Управление общим масштабом оси Y
Когда графики имеют разные диапазоны значений по оси Y, полезно настроить общий масштаб оси, чтобы все данные были видны. Это можно сделать с помощью sharey=True и настройки пределов осей.
Стилизация и форматирование общей метки
Общую метку можно стилизовать, изменяя шрифт, цвет, размер и другие параметры текста, используя аргументы метода fig.text() или свойства объекта текста, возвращаемого методом plt.ylabel(). Например, fontsize, color, fontweight.
Примеры кода
Пример 1: Простая сетка с общей меткой оси Y
import matplotlib.pyplot as plt
import numpy as np
# Создаем данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Создаем подграфики
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, sharey=True)
# Строим графики
ax1.plot(x, y1)
ax2.plot(x, y2)
# Добавляем общую метку оси Y
fig.supylabel('Значение', fontsize=12)
# Добавляем подписи к осям X
ax2.set_xlabel('X', fontsize=10)
# Настраиваем отображение
plt.tight_layout()
plt.show()
Пример 2: Сложный макет с настройкой общего масштаба
import matplotlib.pyplot as plt
import numpy as np
# Создаем данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x) * 100
y2 = np.cos(x)
# Создаем подграфики
fig, axes = plt.subplots(2, 2, figsize=(10, 8), sharex='col')
# Заполняем графики данными
axes[0, 0].plot(x, y1, 'r') # первый график, красный цвет
axes[0, 1].plot(x, y2, 'g') # второй график, зеленый цвет
axes[1, 0].plot(x, -y1, 'b') # третий график, синий цвет
axes[1, 1].plot(x, -y2, 'k') # четвертый график, черный цвет
# Настраиваем общую ось Y только для первого столбца
axes[0, 0].set_ylabel('Y1', fontsize=12)
axes[1, 0].set_ylabel('Y1', fontsize=12)
# Используем fig.text для создания общей метки оси Y для второго столбца
fig.text(0.75, 0.5, 'Y2', va='center', rotation='vertical', fontsize=12)
# Добавляем подписи к осям X (только для нижнего ряда)
axes[1, 0].set_xlabel('X', fontsize=10)
axes[1, 1].set_xlabel('X', fontsize=10)
# Автоматическая настройка размещения подграфиков
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
Альтернативные подходы и лучшие практики
Когда не стоит использовать общую метку оси Y
В случаях, когда подграфики отображают данные с совершенно разными единицами измерения, использование общей метки оси Y может ввести в заблуждение. В таких ситуациях лучше использовать отдельные метки для каждого подграфика.
Другие библиотеки для визуализации с похожим функционалом
Кроме Matplotlib, существуют другие библиотеки для визуализации данных в Python, такие как Seaborn, Plotly и Bokeh. Каждая из них имеет свои преимущества и недостатки. Plotly и Bokeh, например, предлагают интерактивные графики, что может быть полезно для веб-приложений.
Заключение
Создание подграфиков с общей меткой оси Y в Matplotlib – полезный прием для улучшения читаемости и профессионального вида визуализаций. В статье мы рассмотрели основные методы и примеры кода, позволяющие реализовать эту задачу. Правильный выбор метода зависит от конкретных требований к макету и стилю графика. Использование fig.text() предоставляет большую гибкость, а plt.ylabel() с отключением меток – более простой способ для базовых случаев.