Что такое Subplots и зачем нужны общие оси?
В Matplotlib, subplots – это способ размещения нескольких графиков (axes) внутри одной фигуры (figure). Это особенно полезно для сравнения различных аспектов данных или для отображения связанных графиков вместе. Общие оси (shared axes) позволяют нескольким subplots разделять одну и ту же ось X или Y, что обеспечивает синхронизацию масштабов и делает визуализацию более согласованной и понятной.
Представьте, что вы анализируете эффективность различных рекламных кампаний в контекстной рекламе. У вас есть данные о показах, кликах и конверсиях для каждой кампании. Вместо отображения трех отдельных графиков, вы можете создать subplots с общими осями, где ось X представляет время (например, дни или недели), а каждая строка графиков представляет кампанию. Это позволяет легко сравнить динамику показателей разных кампаний в одной визуализации.
Преимущества использования общих осей (shared axes)
Использование общих осей предоставляет несколько преимуществ:
- Синхронизация масштабов: Масштабы осей автоматически синхронизируются между subplots, что упрощает сравнение значений.
- Экономия места: Метки и тики отображаются только на внешних осях, что освобождает место на графике.
- Улучшенная читаемость: График становится более понятным и профессиональным.
- Автоматическое обновление: При изменении масштаба на одном графике, остальные тоже обновляются.
Создание Subplots с общими осями X
Использование plt.subplots() с аргументом sharex=True
Самый простой способ создать subplots с общими осями X – использовать функцию plt.subplots() с аргументом sharex=True. Этот аргумент указывает, что все subplots в столбце должны разделять ось X.
Пример кода: График с общими осями X
import matplotlib.pyplot as plt
import numpy as np
from typing import Tuple, List
def create_shared_x_subplots(data: List[np.ndarray], labels: List[str]) -> Tuple[plt.Figure, List[plt.Axes]]:
"""Создает subplots с общей осью X.
Args:
data: Список массивов numpy, представляющих данные для графиков.
labels: Список меток для графиков.
Returns:
Кортеж, содержащий Figure и список Axes.
"""
fig, axes = plt.subplots(len(data), 1, sharex=True)
for i, ax in enumerate(axes):
ax.plot(data[i])
ax.set_ylabel(labels[i])
axes[-1].set_xlabel("Время") # Метка для общей оси X
return fig, axes
# Пример использования
data1 = np.random.randn(100).cumsum()
data2 = np.random.randn(100).cumsum()
data3 = np.random.randn(100).cumsum()
data = [data1, data2, data3]
labels = ["Кампания A", "Кампания B", "Кампания C"]
fig, axes = create_shared_x_subplots(data, labels)
fig.suptitle("Эффективность рекламных кампаний (общая ось X)")
plt.show()
В этом примере, plt.subplots(len(data), 1, sharex=True) создает сетку subplots с одним столбцом и количеством строк, равным количеству наборов данных. sharex=True обеспечивает общую ось X для всех subplots. Обратите внимание, что метка оси X устанавливается только для последнего subplots, чтобы избежать дублирования.
Настройка отображения меток и тиков на осях X
Можно управлять отображением меток и тиков на общих осях. Например, чтобы отображать метки только на нижнем графике:
for ax in axes[:-1]:
ax.tick_params(axis='x', labelbottom=False)
Создание Subplots с общими осями Y
Использование plt.subplots() с аргументом sharey=True
Аналогично осям X, можно создать subplots с общими осями Y, используя аргумент sharey=True в plt.subplots().
Пример кода: График с общими осями Y
import matplotlib.pyplot as plt
import numpy as np
from typing import Tuple, List
def create_shared_y_subplots(data: List[np.ndarray], labels: List[str]) -> Tuple[plt.Figure, List[plt.Axes]]:
"""Создает subplots с общей осью Y.
Args:
data: Список массивов numpy, представляющих данные для графиков.
labels: Список меток для графиков.
Returns:
Кортеж, содержащий Figure и список Axes.
"""
fig, axes = plt.subplots(1, len(data), sharey=True)
for i, ax in enumerate(axes):
ax.plot(data[i])
ax.set_title(labels[i])
axes[0].set_ylabel("Значение") # Метка для общей оси Y
return fig, axes
# Пример использования
data1 = np.random.randn(100).cumsum()
data2 = np.random.randn(100).cumsum()
data3 = np.random.randn(100).cumsum()
data = [data1, data2, data3]
labels = ["Кампания A", "Кампания B", "Кампания C"]
fig, axes = create_shared_y_subplots(data, labels)
fig.suptitle("Эффективность рекламных кампаний (общая ось Y)")
plt.show()
В этом случае, plt.subplots(1, len(data), sharey=True) создает сетку subplots с одной строкой и количеством столбцов, равным количеству наборов данных. sharey=True делает ось Y общей для всех subplots. Метка оси Y задается только для первого subplots.
Настройка отображения меток и тиков на осях Y
Для управления отображением меток и тиков на осях Y, можно использовать аналогичный подход, как и для осей X:
for ax in axes[1:]:
ax.tick_params(axis='y', labelleft=False)
Создание Subplots с общими осями X и Y
Использование plt.subplots() с аргументом sharex='col' и sharey='row'
Для создания subplots, где все subplots в столбце разделяют ось X, а все subplots в строке разделяют ось Y, можно использовать аргументы sharex='col' и sharey='row'.
Пример кода: Полностью связанные Subplots
import matplotlib.pyplot as plt
import numpy as np
from typing import Tuple, List
def create_fully_shared_subplots(data: List[List[np.ndarray]], row_labels: List[str], col_labels: List[str]) -> Tuple[plt.Figure, List[List[plt.Axes]]]:
"""Создает subplots с общими осями X и Y.
Args:
data: Список списков массивов numpy, представляющих данные для графиков.
row_labels: Список меток для строк.
col_labels: Список меток для столбцов.
Returns:
Кортеж, содержащий Figure и список списков Axes.
"""
num_rows = len(data)
num_cols = len(data[0])
fig, axes = plt.subplots(num_rows, num_cols, sharex='col', sharey='row')
for i in range(num_rows):
for j in range(num_cols):
axes[i, j].plot(data[i][j])
if i == num_rows - 1:
axes[i, j].set_xlabel(col_labels[j])
if j == 0:
axes[i, j].set_ylabel(row_labels[i])
fig.suptitle("Взаимосвязь показателей")
return fig, axes
# Пример использования
data = [
[np.random.randn(100).cumsum(), np.random.randn(100).cumsum()],
[np.random.randn(100).cumsum(), np.random.randn(100).cumsum()]
]
row_labels = ["Кампания A", "Кампания B"]
col_labels = ["Показы", "Клики"]
fig, axes = create_fully_shared_subplots(data, row_labels, col_labels)
plt.show()
Здесь plt.subplots(num_rows, num_cols, sharex='col', sharey='row') создает сетку subplots с общими осями X для каждого столбца и общими осями Y для каждой строки. Метки осей отображаются только на внешних subplots.
Управление отображением меток и тиков для оптимальной читаемости
Оптимизируйте отображение меток и тиков, чтобы график был читаемым. Учитывайте количество subplots и плотность данных.
Продвинутые техники и возможные проблемы
Изменение диапазонов осей и влияние на общие оси
При изменении диапазона одной из общих осей, остальные оси также автоматически обновятся. Однако, если вы хотите установить различные пределы для осей, которые изначально были общими, это может привести к нежелательным результатам. В таких случаях, возможно, потребуется пересмотреть необходимость использования общих осей.
Обработка несовместимых данных на разных Subplots
Если на разных subplots отображаются данные с разными единицами измерения или масштабами, использование общих осей может быть нецелесообразным. В этом случае рекомендуется использовать отдельные оси или применить преобразования данных для приведения их к сопоставимому масштабу.
Использование gridspec для более сложной компоновки с общими осями
Для более сложной компоновки subplots с общими осями можно использовать gridspec. Это позволяет создавать subplots разного размера и располагать их в произвольном порядке.
Решение проблем с наложением меток и тиков
При большом количестве subplots метки и тики могут накладываться друг на друга, что ухудшает читаемость. Для решения этой проблемы можно использовать следующие подходы:
- Уменьшить размер шрифта меток.
- Увеличить расстояние между метками и осями.
- Использовать функцию
plt.tight_layout()для автоматической корректировки расположения элементов графика. - Поворачивать метки осей.