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?
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 для таблиц, 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 объединяет стиль, контекст и палитру за один вызов:
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 по результату:
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 — одна строка, потому что агрегация встроена в график:
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 это цикл по группам с ручной раскраской, здесь — одно слово:
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= в любой функции построения:
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))
1. Что нарисует sns.countplot(data=df, x="city")?
2. Чем seaborn barplot отличается от countplot?
3. Что делает параметр hue="genre" в функциях Seaborn?
4. Что означают вертикальные линии-усики над столбцами barplot?
5. Что произойдёт после вызова sns.set_theme(style="whitegrid")?
В редакторе — заказы кофейни: столбцы drink (напиток) и price (чек в рублях). Постройте barplot среднего чека по напиткам: тема whitegrid, заголовок «Средний чек по напиткам», подпись оси Y «Руб.».
Чем 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-канал или свой блог — так о проекте узнают новые читатели.
Что читать дальше
Matplotlib / Seaborn · Урок 6
Оформление графиков: легенды, аннотации, сетки и стили Matplotlib
Легенда, аннотации со стрелками, сетка, готовые стили и rcParams — доводим график Matplotlib до презентационного уровня и сохраняем в PNG для слайдов.
Matplotlib / Seaborn · Урок 8
Распределения в Seaborn: histplot, boxplot и violinplot
Boxplot отвечает на вопрос «где медиана, каков разброс и кто выбивается» быстрее любой таблицы. Разбираем histplot с kde, ящик с усами и violinplot на ценах квартир — и учимся сравнивать группы через hue.
Matplotlib / Seaborn · Урок 9
Тепловые карты и pairplot: heatmap и матрицы диаграмм
Пять строк — и весь датасет на экране: heatmap рисует корреляционную матрицу цветом, pairplot раскладывает все пары переменных в матрицу диаграмм. Разведочный анализ, который раньше занимал день, теперь занимает минуту.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Pandas · Урок 1
Что такое Pandas и как установить через pip: первые Series и DataFrame
Первая таблица DataFrame в библиотеке pandas, умный столбец Series и быстрый осмотр данных через head, info и describe — старт сквозного анализа данных интернет-магазина.
pandas для начинающихчто такое dataframe
Pandas · Урок 3
Выборка данных в Pandas: loc, iloc и фильтрация строк по условию
loc и iloc, булева маска, isin и between — достаём из таблицы заказов именно те строки и столбцы, которые нужны, и не попадаемся на SettingWithCopyWarning.
pandas loc ilocloc и iloc в pandas в чём разница
Matplotlib / Seaborn · Урок 1
Визуализация данных в Python: первое знакомство с Matplotlib
Первый график в Python за три строки кода, анатомия figure и axes, шпаргалка «какой график для каких данных» и сохранение в PNG. Всё запускается прямо на странице.
matplotlibmatplotlib для начинающих
Проверьте знания по Matplotlib / Seaborn
В челлендже — 20 задач по Matplotlib / Seaborn, по 2 из каждого урока этого раздела. Формат: фрагмент кода и четыре варианта — что напечатает. После ответа — вердикт и объяснение со ссылкой на урок-источник.
Тест по Matplotlib / Seaborn: 20 задач