Краткий обзор библиотеки Matplotlib
Matplotlib — это мощная библиотека Python для визуализации данных, предоставляющая широкие возможности для создания графиков, диаграмм и других визуальных представлений. Она является основой для многих других библиотек визуализации и позволяет пользователям настраивать практически каждый аспект своих графиков.
Необходимость размещения графиков друг над другом
В анализе данных часто возникает потребность в сравнении различных наборов данных или отображении разных аспектов одних и тех же данных. Размещение нескольких графиков друг над другом (или рядом) позволяет эффективно представлять информацию и выявлять взаимосвязи, которые могут быть не очевидны при рассмотрении отдельных графиков. Например, можно сравнить динамику изменения CTR и CPC в рекламной кампании.
Использование plt.subplot() для расположения графиков
Основы plt.subplot(): строки, столбцы, индекс
Функция plt.subplot() позволяет создавать подграфики внутри одной фигуры. Она принимает три аргумента: количество строк, количество столбцов и индекс подграфика. Индекс начинается с 1 и увеличивается слева направо, сверху вниз.
Пример: размещение двух графиков один над другом
Рассмотрим пример, как разместить два графика один над другим, показывая динамику кликов и показов рекламной кампании.
import matplotlib.pyplot as plt
import numpy as np
from typing import List, Tuple
def generate_data(n: int) -> Tuple[List[int], List[float], List[float]]:
"""Генерирует случайные данные для примера.
Args:
n: Количество точек данных.
Returns:
Кортеж из списка дней и двух списков значений (клики, показы).
"""
days: List[int] = list(range(1, n + 1))
clicks: List[float] = np.random.randint(50, 150, n).tolist()
impressions: List[float] = np.random.randint(500, 1500, n).tolist()
return days, clicks, impressions
def plot_clicks_and_impressions(days: List[int], clicks: List[float], impressions: List[float]) -> None:
"""Создает и отображает два графика, расположенных друг над другом.
Args:
days: Список дней.
clicks: Список кликов.
impressions: Список показов.
"""
plt.figure(figsize=(10, 6))
# Первый график (клики)
plt.subplot(2, 1, 1)
plt.plot(days, clicks, color='blue', marker='o')
plt.title('Динамика кликов')
plt.xlabel('День')
plt.ylabel('Клики')
plt.grid(True)
# Второй график (показы)
plt.subplot(2, 1, 2)
plt.plot(days, impressions, color='green', marker='s')
plt.title('Динамика показов')
plt.xlabel('День')
plt.ylabel('Показы')
plt.grid(True)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
days, clicks, impressions = generate_data(30)
plot_clicks_and_impressions(days, clicks, impressions)
В этом примере plt.subplot(2, 1, 1) создает верхний график (2 строки, 1 столбец, первый подграфик), а plt.subplot(2, 1, 2) создает нижний график (2 строки, 1 столбец, второй подграфик).
Настройка внешнего вида графиков (заголовки, оси)
После создания подграфиков можно настроить их внешний вид с помощью функций plt.title(), plt.xlabel(), plt.ylabel() и других. Важно добавлять заголовки и метки осей для понятности графиков.
Применение plt.subplots() для создания нескольких графиков
Преимущества plt.subplots() перед plt.subplot()
Функция plt.subplots() является более удобной альтернативой plt.subplot(), особенно при создании нескольких графиков. Она возвращает кортеж, содержащий объект фигуры и массив объектов осей, что упрощает доступ к каждому подграфику.
Создание двух графиков с помощью plt.subplots()
Перепишем предыдущий пример с использованием plt.subplots():
import matplotlib.pyplot as plt
import numpy as np
from typing import List, Tuple
def generate_data(n: int) -> Tuple[List[int], List[float], List[float]]:
"""Генерирует случайные данные для примера.
Args:
n: Количество точек данных.
Returns:
Кортеж из списка дней и двух списков значений (клики, показы).
"""
days: List[int] = list(range(1, n + 1))
clicks: List[float] = np.random.randint(50, 150, n).tolist()
impressions: List[float] = np.random.randint(500, 1500, n).tolist()
return days, clicks, impressions
def plot_clicks_and_impressions(days: List[int], clicks: List[float], impressions: List[float]) -> None:
"""Создает и отображает два графика, расположенных друг над другом.
Args:
days: Список дней.
clicks: Список кликов.
impressions: Список показов.
"""
fig, axes = plt.subplots(2, 1, figsize=(10, 6))
# Первый график (клики)
axes[0].plot(days, clicks, color='blue', marker='o')
axes[0].set_title('Динамика кликов')
axes[0].set_xlabel('День')
axes[0].set_ylabel('Клики')
axes[0].grid(True)
# Второй график (показы)
axes[1].plot(days, impressions, color='green', marker='s')
axes[1].set_title('Динамика показов')
axes[1].set_xlabel('День')
axes[1].set_ylabel('Показы')
axes[1].grid(True)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
days, clicks, impressions = generate_data(30)
plot_clicks_and_impressions(days, clicks, impressions)
В этом примере plt.subplots(2, 1) создает фигуру с двумя строками и одним столбцом подграфиков. axes[0] ссылается на верхний график, а axes[1] — на нижний.
Общий доступ к осям (sharex, sharey)
plt.subplots() позволяет совместно использовать оси между подграфиками с помощью параметров sharex и sharey. Например, если мы хотим, чтобы оба графика имели одинаковую ось x (дни), можно использовать plt.subplots(2, 1, sharex=True).
Более сложные варианты расположения: GridSpec
Введение в GridSpec и его гибкость
GridSpec предоставляет еще более гибкий способ управления расположением подграфиков. Он позволяет создавать неравномерные сетки, где подграфики могут занимать несколько строк или столбцов.
Создание неравномерной сетки для графиков
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
fig = plt.figure(figsize=(10, 6))
gs = gridspec.GridSpec(3, 3)
# Первый график занимает первую строку и все три столбца
ax1 = plt.subplot(gs[0, :])
ax1.plot(np.random.rand(10), color='red')
ax1.set_title('График 1')
# Второй график занимает вторую и третью строки и первый столбец
ax2 = plt.subplot(gs[1:, 0])
ax2.plot(np.random.rand(5), color='blue')
ax2.set_title('График 2')
# Третий график занимает вторую и третью строки и второй и третий столбцы
ax3 = plt.subplot(gs[1:, 1:])
ax3.plot(np.random.rand(8), color='green')
ax3.set_title('График 3')
plt.tight_layout()
plt.show()
В этом примере gs = gridspec.GridSpec(3, 3) создает сетку 3×3. ax1 = plt.subplot(gs[0, :]) означает, что первый график занимает первую строку и все столбцы. Аналогично, ax2 = plt.subplot(gs[1:, 0]) означает, что второй график занимает вторую и третью строки и первый столбец.
Примеры сложных макетов с использованием GridSpec
GridSpec особенно полезен для создания сложных макетов, где необходимо комбинировать графики разных размеров и форм. Он предоставляет полный контроль над расположением подграфиков.
Дополнительные советы и лучшие практики
Регулировка расстояния между графиками (plt.tight_layout(), hspace, wspace)
Функция plt.tight_layout() автоматически регулирует параметры подграфиков, чтобы они помещались в фигуру без перекрытия. Параметры hspace и wspace (используемые с plt.subplots_adjust()) позволяют вручную настраивать вертикальное и горизонтальное расстояние между графиками.
Обработка перекрытия элементов графиков
Если элементы графиков (например, метки осей или заголовки) перекрываются, попробуйте использовать plt.tight_layout() или вручную настройте параметры подграфиков.
Сохранение графиков в файл
Для сохранения графиков в файл используйте функцию plt.savefig(). Укажите имя файла и формат (например, ‘png’, ‘pdf’, ‘svg’). Например: plt.savefig('my_plot.png').