Визуализация в Python: как строить понятные графики в matplotlib и seaborn
Как выбрать тип графика и собрать его в Python: линии, столбцы, распределения и сравнение сегментов без декоративного шума.

График не должен показывать всё, что есть в таблице. Его задача — помочь увидеть один паттерн: тренд, разницу между сегментами, распределение или выброс. В Python удобство matplotlib и seaborn начинается не с выбора цвета, а с вопроса, на который должна ответить визуализация.
Коротко
Линия показывает изменение во времени, столбцы сравнивают категории, histogram показывает распределение, boxplot помогает увидеть медиану и выбросы. Seaborn даёт удобные статистические шаблоны, matplotlib — полный контроль над композицией и подписями.
- Один график — один главный вывод.
- Подписывай единицу измерения, период и знаменатель.
- Сортируй категории по смыслу, а не по случайному порядку в файле.
- Цвет должен разделять смысл, а не просто украшать холст.
Сначала выбери форму вопроса
Если команда спрашивает “как меняется DAU по дням”, нужен line chart. Если “какой канал принёс больше заказов”, подойдут горизонтальные bars. Для “есть ли длинный хвост чеков” нужен histogram. Неподходящий тип графика может сделать правильные данные трудными для чтения.
| Вопрос | График | На что смотреть |
|---|---|---|
| Как меняется метрика во времени? | line | тренд, сезонность, перелом |
| Какие сегменты отличаются? | bar | уровень и порядок категорий |
| Как распределены значения? | histogram | центр, хвост, выбросы |
| Есть ли связь двух чисел? | scatter | направление и необычные точки |
| Как ведут себя когорты? | heatmap | градиент и провалы по возрасту |
Линия для тренда
Перед построением линии отсортируй даты и приведи данные к одному уровню: например, один день и одна строка на канал. Если на одном дне несколько строк, matplotlib соединит их в порядок чтения DataFrame, и график может выглядеть как случайная пила.
import matplotlib.pyplot as plt
daily = (
events.groupby('event_date', as_index=False)
.agg(dau=('user_id', 'nunique'))
.sort_values('event_date')
)
fig, ax = plt.subplots(figsize=(9, 4))
ax.plot(daily['event_date'], daily['dau'], color='#6d5dfc', linewidth=2)
ax.set(title='DAU by day', xlabel='Date', ylabel='Unique active users')
ax.grid(axis='y', alpha=0.2)
fig.tight_layout()Сравнение сегментов через seaborn
Seaborn удобен, когда данные уже находятся в “длинном” формате: отдельные колонки для даты, сегмента и значения. Он сам создаёт легенду и даёт аккуратные статистические шаблоны. Но подписи и порядок категорий всё равно нужно задать самостоятельно.
Для бизнес-решения рядом нужны количество заказов и доверительный диапазон, а не только среднее.
import seaborn as sns
import matplotlib.pyplot as plt
channel_avg = orders.groupby('channel', as_index=False).agg(
average_order=('revenue', 'mean'),
)
channel_avg = channel_avg.sort_values('average_order')
fig, ax = plt.subplots(figsize=(8, 4))
sns.barplot(data=channel_avg, x='average_order', y='channel', color='#0f9f76', ax=ax)
ax.set(xlabel='Average order value, RUB', ylabel='Channel')
fig.tight_layout()Почему красивый график может врать
Обрезанная ось превращает маленькую разницу в драматичный разрыв. Среднее скрывает несколько крупных заказов. Сглаженная линия создаёт впечатление причинности. График помогает сформировать вопрос, но не отвечает на него без определения метрики, размера базы и проверки сегментов.
После визуального сигнала вернись к зерну, знаменателю и статистической неопределённости. Особенно если график должен привести к продуктовой или финансовой рекомендации.
- Показывай размер сегмента рядом с процентом или средним.
- Для ratio-метрик не смешивай среднее по пользователям с отношением сумм.
- Не используй двойную ось без крайней необходимости.
- Отмечай неполный текущий период.
- Сохраняй исходную таблицу, из которой построен график.
Материалы по теме
Как тестировать аналитические расчёты на Python и pandas
Практический гайд по тестам для аналитика: проверить метрики на маленьком датасете, поймать регрессию и защитить расчёт от тихих изменений.
Читать материал
Как ускорить pandas: память, типы и обработка больших файлов
Что делать, если pandas медленно работает или не помещает файл в память: категории, downcast, chunksize, Parquet и контроль размера данных.
Читать материал
Pandas apply и векторизация: как писать быстрее и понятнее
Когда использовать apply, почему векторные операции быстрее и как переписать медленный построчный расчёт в pandas.
Читать материал