Перейти к содержанию

172 уроков, 13 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 7 из 10 Средний 40 мин 120 XP

Seaborn для начинающих: красивые графики одной строкой

Seaborn рисует статистические графики из DataFrame одной строкой: темы set_theme, countplot, barplot с доверительными интервалами и разбивка hue — прямо в браузере.

Редакция Питоники

В шестом уроке об оформлении графиков Matplotlib мы собирали презентационный график вручную: label, легенда, аннотация, сетка, rc_context — красиво, но строк двадцать на одну картинку. Теперь покажу фокус: тот же уровень аккуратности — темы, сетка, палитры и даже автоматическая агрегация данных — библиотека Seaborn делает одной строкой. Для начинающего аналитика это самая быстрая инвестиция из всех, что я знаю: красивые графики Python без изучения сотни параметров.

Что такое Seaborn: надстройка, а не замена

Seaborn — библиотека статистической визуализации поверх Matplotlib: Майкл Ваком написал её в 2012 году, чтобы закрывать типовые задачи анализа данных за минимальное число строк. Он не конкурент Matplotlib, а удобный слой над ним: под капотом Seaborn вызывает те же функции, и каждый его график — обычные Figure и Axes, к которым применимо всё из уроков 1–6.

  • Тему оформления: фон, сетка и шрифты — одним вызовом set_theme().
  • Агрегацию: countplot сам считает частоты, barplot сам считает средние.
  • Разбивку по группам: hue= раскрашивает данные по категориальному столбцу.
  • Подписи осей: имена берутся прямо из колонок pandas DataFrame.

Следствие из «надстройки»: любой seaborn-график можно доводить привычными методами Matplotlib — set_title, annotate, savefig работают как раньше. Это скоростная трасса поверх знакомых дорог. Актуальная версия — 0.13.x: если где-то в старой статье встретится функция sns.dist(), не копируйте её, она давно удалена и заменена на histplot из следующего урока.

Первый график на Seaborn: одна строка вместо шести

Вспомните шаблон из первого урока: subplots, plot, set_title, set_xlabel, set_ylabel, grid — шесть строк до появления приличной картинки. Seaborn делает то же самое компактнее, потому что тема включается сама и подписи осей берутся из таблицы:

Как построить график из DataFrame в Python?

Первый график на Seaborn
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Траты на кофе по месяцам, тыс. руб.
cafe = pd.DataFrame({
    "month": ["Янв", "Фев", "Мар", "Апр", "Май", "Июн"],
    "thousand": [38, 42, 40, 47, 51, 49],
})

sns.set_theme()
sns.lineplot(data=cafe, x="month", y="thousand", marker="o")
plt.title("Траты на кофе: одна строка seaborn")
plt.show()
Вывод
График отображается под редактором
Первый запуск загружает pandas и seaborn — это займёт до минуты

Три импорта — стандартная связка: pandas для таблиц, pyplot для финальных штрихов, seaborn для рисования. sns.set_theme() включил тему darkgrid — серый фон, белая сетка, аккуратные шрифты. А sns.lineplot(data=..., x=..., y=...) получил имена столбцов вместо списков и сам подписал оси. В Matplotlib из шестого урока тот же уровень занял бы set_xlabel, set_ylabel, ax.grid и настройку rcParams.

Тема за секунду: set_theme и set_style

sns.set_theme() без аргументов включает darkgrid, но параметрами можно настроить всё сразу: style отвечает за фон и сетку, context — за масштаб шрифтов, palette — за цвета. По духу это тот же plt.style из шестого урока, только заточенный под статистические графики.

Пять тем Seaborn, которые стоит знать

  • darkgrid — серый фон, белые линии сетки; дефолт set_theme().
  • whitegrid — белый фон, серые линии сетки; мой выбор для отчётов и печати.
  • dark — тёмный фон без сетки; графики «на ночь глядя».
  • white — белый фон без сетки, минимализм.
  • ticks — белый фон и чёрточки-деления на осях; строгий научный стиль.

Контекст — вторая ручка: context="talk" делает шрифты крупными для выступления, context="poster" — ещё крупнее для постеров, context="paper" — мельче для статей. Одна строка, и график читается с заднего ряда аудитории. Есть и отдельная функция sns.set_style(), которая меняет только фон, — set_theme объединяет стиль, контекст и палитру за один вызов:

Тема whitegrid и контекст talk
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

tickets = pd.DataFrame({
    "day": ["Пн", "Вт", "Ср", "Чт", "Пт", "Пн", "Вт", "Ср", "Чт", "Пт"],
    "price": [245, 231, 260, 248, 272, 238, 240, 255, 251, 266],
})

sns.set_theme(style="whitegrid", context="talk")  # крупный шрифт для слайдов
ax = sns.barplot(data=tickets, x="day", y="price")
ax.set_title("Средний чек по дням недели")
plt.show()
Вывод
График отображается под редактором

Данные для урока: DataFrame своими руками

Почти каждый seaborn-туториал в интернете начинается со строки df = sns.load_dataset("tips") — и это хороший повод объяснить, откуда берутся данные. load_dataset при первом вызове скачивает CSV с GitHub: у Дэвида Уэйна собрана коллекция классических учебных датасетов — чаевые, пассажиры Титаника, погода. В нашей браузерной песочнице сеть закрыта, поэтому данные создаём руками через pd.DataFrame — заодно повторим pandas:

Заказы кофейни за неделю
import pandas as pd
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
    "drink": ["латте", "капучино", "эспрессо", "латте", "капучино", "латте",
              "эспрессо", "капучино", "латте", "эспрессо", "латте", "капучино"],
    "price": [260, 240, 150, 255, 245, 262, 145, 238, 258, 152, 270, 244],
})

print(len(orders))
print(orders["drink"].nunique())
Вывод
12
3

Двенадцать заказов, три напитка, пять дней. Таблица маленькая — чтобы каждая цифра в выводе проверялась глазами, — но все приёмы работают и на миллионах строк.

countplot: частоты категорий одной строкой

Первый вопрос к таблице заказов: сколько заказов было в каждый день? В Matplotlib это решалось в два хода: сначала df["day"].value_counts(), потом plt.bar по результату:

Путь Matplotlib: два хода
import pandas as pd
import matplotlib.pyplot as plt

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
})

counts = orders["day"].value_counts()      # считаем частоты сами
plt.bar(counts.index, counts.values)
plt.title("Заказы по дням: Matplotlib, два хода")
plt.show()
Вывод
График отображается под редактором

В Seaborn — одна строка, потому что агрегация встроена в график:

Путь Seaborn: одна строка
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
})

sns.set_theme()
ax = sns.countplot(data=orders, x="day")
ax.set_title("Заказы по дням: countplot считает сам")
plt.show()
Вывод
График отображается под редактором

Высота столбца равна числу строк с этим значением категории. Это «гистограмма для категорий»: hist из третьего урока разбивает числа на интервалы, countplot — строки таблицы на категории. Путать их не стоит: hist отвечает на вопрос «как распределены числа», countplot — «из чего состоит таблица».

barplot: среднее по группам и доверительные интервалы

sns.barplot(data=orders, x="day", y="price") делает заметно больше, чем bar из Matplotlib: сгруппирует чеки по дням, посчитает среднее, нарисует столбцы и добавит усики — 95-процентные доверительные интервалы, оценённые бутстрепом. Столбец отвечает на вопрос «сколько в среднем стоит заказ в этот день», усики — «насколько мы в этом уверены»:

Средний чек по дням с интервалами
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
    "price": [260, 240, 150, 255, 245, 262, 145, 238, 258, 152, 270, 244],
})

sns.set_theme()
ax = sns.barplot(data=orders, x="day", y="price")
ax.set_title("Средний чек по дням и его разброс")
ax.set_ylabel("Средний чек, руб.")
plt.show()
Вывод
График отображается под редактором

Что за усики над столбцами

Усик — это интервал, в котором с вероятностью 95% лежит настоящее среднее значение. Широкие усики означают мало данных или большой разброс: во вторник чеки 150 и 255 рублей дали заметный интервал, тогда как по пятнице с тремя близкими заказами усик узкий. Читателю графика это сообщает честнее, чем голое число: видна надёжность каждого среднего.

hue: третье измерение цветом

Параметр hue= разбивает каждый столбец по значениям ещё одного категориального столбца: цветом, с легендой и палитрой в комплекте. В Matplotlib это цикл по группам с ручной раскраской, здесь — одно слово:

Что пьют по дням: разбивка hue
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
    "drink": ["латте", "капучино", "эспрессо", "латте", "капучино", "латте",
              "эспрессо", "капучино", "латте", "эспрессо", "латте", "капучино"],
})

sns.set_theme()
ax = sns.countplot(data=orders, x="day", hue="drink")
ax.set_title("Что пьют по дням: hue разбил по напиткам")
plt.show()
Вывод
График отображается под редактором

hue работает почти во всех функциях Seaborn — lineplot, barplot, histplot, scatterplot — и всегда означает одно и то же: «разбей по этому столбцу и раскрась». Это самый ходовой параметр библиотеки после data=; на нём держится большинство сравнений групп. Две оговорки из практики: hue принимает категориальные столбцы — числа вроде цены годятся формально, но график превратится в легенду из сотни цветов; а порядок групп можно зафиксировать параметром order=, если алфавитный порядок Seaborn вас не устраивает.

Палитры Seaborn: palette одной строкой

Идеи Okabe-Ito из шестого урока встроены в Seaborn: palette="colorblind" выбирает цвета, различимые при нарушениях цветовосприятия. Есть и тематические наборы: deep, muted, pastel, Set2. Посмотреть цвета можно функцией sns.color_palette("Set2"), а применить — тем же параметром palette= в любой функции построения:

Палитра colorblind в действии
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
    "drink": ["латте", "капучино", "эспрессо", "латте", "капучино", "латте",
              "эспрессо", "капучино", "латте", "эспрессо", "латте", "капучино"],
})

sns.set_theme()
ax = sns.countplot(data=orders, x="day", hue="drink", palette="colorblind")
ax.set_title("Палитра colorblind: цвета различимы для всех")
plt.show()
Вывод
График отображается под редактором

Seaborn или Matplotlib: что выбрать

Мой рабочий алгоритм простой: анализ начинается со Seaborn, а заканчивается Matplotlib. Seaborn за две-три строки даёт честный статистический график; доводка — аннотации, сетка, экспорт из шестого урока — уже через привычные ax-методы, потому что объект один и тот же. Шпаргалка по распределению ролей:

ЗадачаИнструмент
Быстрый график из DataFrame со статистикойSeaborn: countplot, barplot, lineplot
Сравнение распределений по группамSeaborn: boxplot и violinplot (урок 8)
Корреляции и разведочный анализSeaborn: heatmap и pairplot (урок 9)
Нестандартная композиция, доводка до пикселяMatplotlib
Дашборд из нескольких панелейСвязка: Seaborn рисует панели, subplots компонует

Если сомневаетесь — начните со Seaborn: даже если график придётся переделывать, вы потеряете минуты, а не часы. Верно и обратное: сложный чертёж с нестандартной композицией сразу проектируйте в Matplotlib.

Доводим Seaborn-график до готового

Раз Seaborn рисует обычные Axes, вся техника шестого урока применима без оговорок: заголовок через ax.set_title, свои подписи осей, аннотации. Плюс одна seaborn-функция для финального штриха — sns.despine() срезает верхнюю и правую линии рамки, отчего график дышит:

Чистый финальный график
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    "day": ["Пн", "Пн", "Вт", "Вт", "Ср", "Ср", "Ср", "Чт", "Чт", "Пт", "Пт", "Пт"],
    "price": [260, 240, 150, 255, 245, 262, 145, 238, 258, 152, 270, 244],
})

sns.set_theme(style="white")
ax = sns.barplot(data=orders, x="day", y="price", color="#56B4E9")
sns.despine()                                  # срезаем верх и право рамки
ax.set_title("Средний чек: чистый стиль")
ax.set_xlabel("")
ax.set_ylabel("Руб.")
plt.show()
Вывод
График отображается под редактором

Девять строк, из которых половина — данные. Типичный аналитический график рождается именно так: Seaborn сделал статистику и тему, Matplotlib добавил последний штрих, а устаревший спор «seaborn или matplotlib» разрешается сам собой — в пользу обоих.

Что дальше

Следующий урок — распределения в Seaborn: histplot, boxplot и violinplot: kde-кривые, легендарный «ящик с усами» и сравнение групп. Потом — тепловые карты heatmap и pairplot, а в десятом уроке — проекте по визуализации соберём из всего курса дашборд по данным о фильмах. До встречи там попробуйте подставить в коды этого урока свои данные: список покупок, бюджет, звонки. Одна строка countplot вместо десяти строк Matplotlib окупается с первого графика. Экономия строк работает и в масштабе курса: весь путь от первой линии до дашборда — самоучитель Matplotlib.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

import pandas as pd

df = pd.DataFrame({"day": ["Mon", "Tue", "Mon", "Wed", "Mon"]})
print(df["day"].value_counts()["Mon"])
import pandas as pd
import seaborn as sns

df = pd.DataFrame({"cat": ["A", "B", "A", "C", "B", "A"]})
ax = sns.countplot(data=df, x="cat")
print(len(ax.patches))
Проверь себя
0 / 5

1. Что нарисует sns.countplot(data=df, x="city")?

2. Чем seaborn barplot отличается от countplot?

3. Что делает параметр hue="genre" в функциях Seaborn?

4. Что означают вертикальные линии-усики над столбцами barplot?

5. Что произойдёт после вызова sns.set_theme(style="whitegrid")?

Карточки терминов
Запомнено: 0 / 6
Практика

В редакторе — заказы кофейни: столбцы drink (напиток) и price (чек в рублях). Постройте barplot среднего чека по напиткам: тема whitegrid, заголовок «Средний чек по напиткам», подпись оси Y «Руб.».

practice.py
Вопросы и ответы по уроку

Чем Seaborn отличается от Matplotlib?

Seaborn — надстройка над Matplotlib: он рисует теми же Axes, но сам делает темы, агрегацию по категориям и палитры. Быстрый статистический график — Seaborn, тонкая доводка — методы Matplotlib поверх того же объекта.

Как построить график из DataFrame pandas?

Передайте таблицу параметром data= и укажите имена столбцов: sns.barplot(data=df, x="day", y="price"). Seaborn сам агрегирует, раскрасит и подпишет оси именами колонок. Основы таблиц — в разделе Pandas, например урок про groupby.

Что означают усики над столбцами в seaborn barplot?

Это 95-процентный доверительный интервал среднего, оценённый бутстрепом. Широкие усики — мало данных или большой разброс: во вторник чеки 150 и 255 рублей дали заметный интервал, а по пятнице с тремя близкими заказами усик узкий. Сумму barplot не покажет — он усредняет.

Почему sns.load_dataset выдаёт ошибку в песочнице?

load_dataset скачивает CSV с сервера GitHub, а сеть в браузерной песочнице закрыта. Создайте DataFrame вручную через pd.DataFrame — все функции Seaborn работают с локальными таблицами.

Seaborn или Matplotlib — что выбрать новичку?

Начинайте со Seaborn: одна строка даёт аккуратный график, и ошибки дизайна не отвлекают от данных. Но базу Matplotlib (figure, axes, plot) знать нужно — без неё любая нестандартная задача станет тупиком.

Понравился урок? Сошлитесь на него

«Мой рабочий алгоритм простой: анализ начинается со Seaborn, а заканчивается Matplotlib.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.

Проверьте знания по Matplotlib / Seaborn

В челлендже — 20 задач по Matplotlib / Seaborn, по 2 из каждого урока этого раздела. Формат: фрагмент кода и четыре варианта — что напечатает. После ответа — вердикт и объяснение со ссылкой на урок-источник.

Тест по Matplotlib / Seaborn: 20 задач