6. Линейные графики и временные ряды
Если ваши данные имеют временную привязку (продажи по дням, курс валют, трафик на сайте), то ваш выбор — sns.lineplot().
Для этого примера нам придется попрощаться с пингвинами (они не меняются во времени) и загрузить датасет flights, который показывает количество авиапассажиров по месяцам с 1949 по 1960 год.
flights = sns.load_dataset("flights")
print(flights.head())
Результат:
year month passengers
0 1949 Jan 112
1 1949 Feb 118
...
Автоматическая агрегация и «тень»
В Matplotlib, если у вас есть несколько точек данных для одного значения X (например, 12 месяцев для 1949 года), и вы построите линейный график, вы получите кашу из вертикальных линий.
Seaborn умнее. Если вы передадите ему «сырые» данные, он автоматически:
-
Посчитает среднее значение для каждой точки X (года).
-
Нарисует полупрозрачную тень вокруг линии — это доверительный интервал (confidence interval).
Эта тень показывает разброс данных. Если она узкая — значения в этом году были стабильны. Если широкая — была сильная волатильность (сезонность).
plt.figure(figsize=(10, 6))
# Строим график общего тренда
sns.lineplot(data=flights, x="year", y="passengers")
plt.title("Рост пассажиропотока (среднее по годам)")
plt.show()
Вы сразу видите глобальный тренд: количество пассажиров растет. Тень говорит нам о том, что с годами увеличивается не только среднее количество, но и разброс между «тихими» и «популярными» месяцами (тень расширяется к концу графика).
Детализация (Hue)
Если мы хотим видеть не среднюю температуру по больнице, а каждый месяц отдельно, используем уже знакомый параметр hue.
plt.figure(figsize=(10, 6))
sns.lineplot(data=flights, x="year", y="passengers", hue="month", palette="viridis")
plt.title("Пассажиропоток по месяцам")
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0) # Выносим легенду наружу
plt.show()
Теперь мы видим четкую сезонность: летом (светлые и зеленые линии) летают гораздо больше, чем зимой (фиолетовые линии), и этот разрыв увеличивается с каждым годом.
Полезно знать:
-
Если тень вам мешает или график перегружен, её можно отключить параметром errorbar=None (в старых версиях ci=None).
-
Если нужно добавить маркеры на линию (точки), используйте marker='o'.
7. Тепловая карта (Heatmap) — любимец публики
Если Scatterplot показывает отношение двух переменных, то Heatmap позволяет взглянуть на все отношения сразу. Это самый эффектный способ визуализировать таблицы, где значения кодируются цветом.
Кейс 1: Матрица корреляций
Самая частая задача в Data Science: «Что с чем связано?». Зависит ли масса тела пингвина от длины его клюва?
Чтобы это узнать, сначала строим матрицу корреляций с помощью Pandas (.corr()), а затем скармливаем её в sns.heatmap().
# Рассчитываем корреляцию (только для числовых колонок)
# numeric_only=True обязателен в новых версиях Pandas, чтобы игнорировать текстовые поля
corr_matrix = df.corr(numeric_only=True)
plt.figure(figsize=(8, 6))
sns.heatmap(
corr_matrix,
annot=True, # Пишем значения внутри ячеек
cmap='coolwarm', # Цветовая гамма (синий-белый-красный)
fmt=".2f", # Формат чисел (2 знака после запятой)
vmin=-1, vmax=1 # Фиксируем границы цветов (от -1 до 1)
)
plt.title("Матрица корреляций параметров пингвинов")
plt.show()
На что смотреть:
-
Красный (близко к 1): Сильная прямая связь. Например, flipper_length_mm и body_mass_g (0.87) — чем длиннее ласты, тем тяжелее пингвин. Логично.
-
Синий (близко к -1): Обратная связь.
-
Белый (около 0): Связи нет.
Лайфхак: используйте палитру coolwarm или RdBu для корреляций, чтобы ноль всегда был нейтрального (белого) цвета.
Кейс 2: Временная сетка
Вернемся к датасету flights. Линейный график показал нам тренд, но Heatmap может показать структуру сезона еще нагляднее.
Для этого нам нужно превратить длинную таблицу в широкую (сводную), где строки — это месяцы, а столбцы — годы.
# Трансформируем данные в матрицу
flights_matrix = flights.pivot(index="month", columns="year", values="passengers")
plt.figure(figsize=(10, 7))
sns.heatmap(
flights_matrix,
cmap="YlGnBu", # Желто-зелено-синяя палитра (хороша для количеств)
linewidths=0.5, # Делаем сетку между ячейками
annot=True,
fmt="d" # Формат "d" (integer) для целых чисел
)
plt.title("Тепловая карта пассажиропотока")
plt.show()
Теперь мы видим данные как «плитку».
-
По вертикали: Видно, что июль и август (самые темные ячейки) — самые загруженные месяцы в любом году.
-
По горизонтали: Видно, как с годами цвет становится все темнее (общий рост потока).
Это идеальный график для поиска сезонных паттернов и аномалий в продажах, трафике или активности пользователей.
8. Быстрый обзор всего датасета (Pairplot)
Представьте, что вы только что получили новый датасет. Вы еще не знаете, какие параметры важны, а какие — мусор. Вам нужно провести EDA (Exploratory Data Analysis) и быстро взглянуть на все возможные связи.
Строить 10 разных scatterplot вручную — долго.
sns.pairplot() делает это одной командой.
Эта функция берет все числовые переменные вашего датасета и строит сетку графиков «каждый с каждым».
# Строим сетку графиков
# corner=True убирает дублирующиеся графики сверху (зеркальные), делая картинку чище
sns.pairplot(df, hue="species", palette="husl", corner=True)
plt.show()
Как читать этот график?
Вы получите треугольную сетку (благодаря corner=True), где:
-
По диагонали: Расположены графики распределения (KDE или гистограммы) для каждой конкретной переменной. Здесь мы видим, как разделяются виды пингвинов по каждому отдельному параметру.
-
Остальные ячейки: Это scatterplot для пары переменных (пересечение строки и столбца).
Это мощнейший инструмент для поиска инсайтов:
-
Вы сразу видите, какие пары переменных линейно зависимы (выстраиваются в линию).
-
Вы видите, какие признаки лучше всего разделяют классы (например, если на диагонали горбы разных цветов далеко друг от друга — это отличный признак для модели машинного обучения).
⚠️ Осторожно: Производительность
pairplot — очень жадная функция. Если у вас в датасете 50 колонок, Seaborn попытается построить 2500 графиков (50x50). Это гарантированно «повесит» ваш ноутбук.
Совет: Если датасет большой, выбирайте только интересные колонки явно:
# Выбираем только конкретные колонки для анализа
cols_to_plot = ["bill_length_mm", "bill_depth_mm", "body_mass_g"]
sns.pairplot(df, vars=cols_to_plot, hue="species")
plt.show()
Используйте pairplot как инструмент первой разведки, чтобы понять, куда копать дальше.
9. Финальные штрихи (Кастомизация)
Вы построили график, нашли инсайт, и теперь картинку нужно вставить в отчет или презентацию. Но вот беда: подписи осей на английском (названия колонок), заголовок отсутствует, а размер картинки слишком мал.
Так как Seaborn стоит на плечах Matplotlib, мы можем использовать все команды из matplotlib.pyplot для настройки внешнего вида.
Вот универсальный рецепт «причесывания» графика перед публикацией:
-
Размер: Задаем plt.figure() до команды построения графика.
-
Подписи: Используем plt.title, plt.xlabel, plt.ylabel после построения.
-
Сохранение: Используем plt.savefig вместо plt.show.
Пример полного цикла:
# 1. Задаем размер полотна в дюймах (Ширина, Высота)
plt.figure(figsize=(12, 6))
# 2. Рисуем график
# Добавим параметр s=100, чтобы точки были крупнее
sns.scatterplot(data=df, x="bill_length_mm", y="bill_depth_mm", hue="species", s=100)
# 3. Настраиваем подписи (можно использовать русский язык)
plt.title("Зависимость размеров клюва пингвинов", fontsize=18, pad=20)
plt.xlabel("Длина клюва (мм)", fontsize=14)
plt.ylabel("Глубина клюва (мм)", fontsize=14)
# 4. Настраиваем легенду
# loc='best' — matplotlib сам найдет свободное место
plt.legend(title="Вид пингвина", title_fontsize='13', loc='upper right')
# 5. Сохраняем результат
# dpi=300 — высокое разрешение для печати
# bbox_inches='tight' — убирает лишние белые поля и гарантирует, что подписи не обрежутся
plt.savefig("penguins_final.png", dpi=300, bbox_inches='tight')
# Показываем (если вы в ноутбуке)
plt.show()
Чек-лист важных параметров:
-
figsize=(12, 6): Если график кажется сплюснутым, играйте с этими числами. Для презентаций часто подходит соотношение 16:9.
-
plt.xticks(rotation=45): Если подписи на оси X длинные и наезжают друг на друга (часто бывает с датами), эта команда повернет их на 45 градусов.
-
bbox_inches='tight': Это "золотая" настройка при сохранении. Без неё Matplotlib часто обрезает длинные подписи осей или легенду, которая вылезла за край графика.
-
dpi: Для экрана хватит 100-150, для печати или качественной презентации ставьте 300.
Теперь ваш график выглядит профессионально и готов к публикации.
Заключение
Мы прошли путь от установки библиотеки до сохранения готового к публикации графика. Как видите, Seaborn — это не просто «еще одна библиотека», это настоящий усилитель продуктивности. В то время как Matplotlib дает вам полный контроль над каждым пикселем (что иногда необходимо), Seaborn позволяет пропустить этап борьбы с настройками и сразу сосредоточиться на смысле данных.
Что мы вынесли:
-
Эстетика важна: sns.set_theme() делает графики профессиональными по умолчанию.
-
Меньше кода — меньше багов: Сложные визуализации вроде pairplot или heatmap строятся одной командой.
-
Pandas-friendly: Библиотека нативно понимает DataFrames, что избавляет от лишних циклов и преобразований массивов.
Конечно, в одну статью невозможно уместить всё. За кадром остались мощные инструменты вроде FacetGrid (для построения сетки графиков по условиям), JointPlot (комбинация scatterplot и гистограмм) и тонкая настройка палитр.