matplotlib для аналитика данных — гайд с примерами
Коротко
matplotlib — основная библиотека визуализации в Python. На собеседованиях аналитиков визуализация встречается реже, чем SQL или pandas, но когда встречается — спрашивают именно matplotlib. Типичный сценарий: «постройте график метрики по дням» или «покажите распределение». Библиотека громоздкая, API местами странный, но знать базу нужно.
В этом гайде — шесть основных типов графиков с кодом, таблица «задача - график», сравнение с seaborn и вопросы с собеседований. Если хотите потренировать Python-задачи на практике — заходите в тренажер.
Базовый синтаксис
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot([1, 2, 3, 4], [10, 20, 15, 25])
ax.set_title('Заголовок')
ax.set_xlabel('Ось X')
ax.set_ylabel('Ось Y')
plt.tight_layout()
plt.show()plt.subplots() возвращает фигуру и объект осей. Через ax настраиваете всё: данные, подписи, легенду. Это объектно-ориентированный подход — он надежнее, чем цепочка plt.plot(), plt.title() и т.д., особенно когда на одном рисунке несколько графиков.
figsize задает размер в дюймах. tight_layout() убирает обрезанные подписи — привыкайте ставить его всегда.
Line chart — метрики по дням
Линейный график — для временных рядов и трендов.
import pandas as pd
dates = pd.date_range('2026-01-01', periods=30)
revenue = [100 + i * 5 + (i % 7) * 10 for i in range(30)]
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(dates, revenue, marker='o', markersize=3, linewidth=1.5)
ax.set_title('Выручка по дням')
ax.set_xlabel('Дата')
ax.set_ylabel('Выручка, тыс. руб.')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()marker='o' помогает видеть отдельные точки. grid с прозрачностью — чтобы сетка не перетягивала внимание.
Bar chart — выручка по категориям
Столбчатый график — для сравнения категорий.
categories = ['Электроника', 'Одежда', 'Еда', 'Книги', 'Спорт']
revenue = [450, 320, 280, 150, 200]
fig, ax = plt.subplots(figsize=(8, 4))
bars = ax.bar(categories, revenue, color='steelblue', edgecolor='white')
ax.set_title('Выручка по категориям')
ax.set_ylabel('Выручка, тыс. руб.')
# подписи значений над столбцами
for bar in bars:
ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 5,
f'{bar.get_height():.0f}', ha='center', fontsize=9)
plt.tight_layout()
plt.show()Горизонтальный вариант (ax.barh) лучше, когда названий категорий много и они длинные.
Histogram — распределение чеков
Гистограмма — для распределения непрерывной величины.
import numpy as np
checks = np.random.lognormal(mean=6, sigma=0.8, size=5000)
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(checks, bins=50, color='steelblue', edgecolor='white', alpha=0.8)
ax.set_title('Распределение суммы чеков')
ax.set_xlabel('Сумма чека, руб.')
ax.set_ylabel('Количество')
ax.axvline(np.median(checks), color='red', linestyle='--', label=f'Медиана: {np.median(checks):.0f}')
ax.legend()
plt.tight_layout()
plt.show()bins — количество корзин. Слишком мало — теряете форму распределения, слишком много — шум. 30-50 обычно нормально. axvline рисует вертикальную линию — удобно показать медиану или перцентиль.
Scatter plot — корреляция двух метрик
Диаграмма рассеяния — когда нужно увидеть связь между двумя числовыми переменными.
sessions = np.random.randint(10, 500, size=200)
revenue = sessions * np.random.uniform(0.5, 2.0, size=200) + np.random.normal(0, 50, 200)
fig, ax = plt.subplots(figsize=(7, 5))
ax.scatter(sessions, revenue, alpha=0.5, s=20, color='steelblue')
ax.set_title('Сессии vs Выручка')
ax.set_xlabel('Количество сессий')
ax.set_ylabel('Выручка, руб.')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()alpha — прозрачность точек. Без нее при большом количестве точек всё сливается в одно пятно.
Boxplot — выбросы
Boxplot (ящик с усами) — для распределения и выбросов по группам.
data = [np.random.normal(loc, 15, 100) for loc in [50, 65, 55, 80]]
labels = ['Q1', 'Q2', 'Q3', 'Q4']
fig, ax = plt.subplots(figsize=(7, 4))
ax.boxplot(data, tick_labels=labels, patch_artist=True,
boxprops=dict(facecolor='steelblue', alpha=0.6))
ax.set_title('Средний чек по кварталам')
ax.set_ylabel('Средний чек, руб.')
plt.tight_layout()
plt.show()Линия внутри ящика — медиана. Края ящика — 25-й и 75-й перцентили. Точки за усами — выбросы. На собеседованиях часто просят «покажите выбросы» — boxplot для этого идеален.
Pie chart — доли сегментов
segments = ['Новые', 'Вернувшиеся', 'Спящие', 'Отток']
shares = [35, 40, 15, 10]
fig, ax = plt.subplots(figsize=(6, 6))
ax.pie(shares, labels=segments, autopct='%1.0f%%', startangle=90,
colors=['#4CAF50', '#2196F3', '#FFC107', '#F44336'])
ax.set_title('Сегменты пользователей')
plt.tight_layout()
plt.show()Pie chart — самый спорный тип графика. Людям сложно сравнивать углы. Если сегментов больше 4-5 или доли близки — bar chart читается лучше. На собесе могут спросить, почему вы выбрали pie — будьте готовы объяснить, когда он уместен (2-4 категории, сильно разные доли) и когда нет.
Подробнее о выборе графиков — в статье типы графиков для аналитика.
Какой график для какой задачи
| Задача | График | Функция |
|---|---|---|
| Тренд метрики по времени | Line chart | ax.plot() |
| Сравнение категорий | Bar chart | ax.bar() / ax.barh() |
| Распределение значений | Histogram | ax.hist() |
| Связь двух переменных | Scatter plot | ax.scatter() |
| Выбросы и разброс по группам | Boxplot | ax.boxplot() |
| Доли целого (2-4 категории) | Pie chart | ax.pie() |
seaborn vs matplotlib
seaborn — обёртка над matplotlib. Красивее из коробки, проще синтаксис для статистических графиков, хорошо работает с pandas DataFrame. Но под капотом — тот же matplotlib.
matplotlib — когда нужен полный контроль: кастомные аннотации, нестандартная сетка subplots, экспорт в определенном формате. seaborn — когда нужно быстро построить heatmap, pairplot или violinplot и не писать 20 строк настройки.
На собеседовании обычно не принципиально, что вы используете — но знать matplotlib нужно, потому что seaborn не покрывает всё.
Типичные ошибки
Нет подписей осей и заголовка. График без подписей — бессмысленный набор линий. Всегда добавляйте set_xlabel, set_ylabel, set_title. На собесе за это снижают.
Неправильный тип графика. Line chart для категорий, pie chart для 10 сегментов, bar chart для временного ряда. Каждый тип графика заточен под свою задачу — используйте таблицу выше.
Злоупотребление pie chart. Если долей больше 4-5 или они близки по размеру — переключайтесь на bar chart. Pie chart — для случаев, когда разница очевидна.
Перегруженность. Пять линий на одном графике без легенды, радужная палитра, 3D-эффекты. Хороший график — простой и читаемый.
Вопросы с собеседований
Когда лучше использовать boxplot, а когда histogram? Histogram — когда нужно видеть форму распределения (нормальное, логнормальное, бимодальное). Boxplot — когда нужно сравнить распределения по группам и увидеть выбросы. Для одной переменной histogram информативнее, для сравнения 5+ групп — boxplot компактнее.
Почему pie chart — плохой выбор для визуализации? Люди плохо сравнивают углы. Если два сегмента — 23% и 27%, на pie chart это неотличимо. Bar chart позволяет точно сравнить по высоте. Pie chart уместен только при 2-4 категориях с явно разными долями.
Чем plt.plot() отличается от объектно-ориентированного подхода?
plt.plot() — функциональный стиль, работает с «текущей» осью. Удобен для одного графика. Объектно-ориентированный подход (fig, ax = plt.subplots()) дает явный контроль — какой оси принадлежит график, проще работать с subplots. Для production-кода и сложных визуализаций — OO-подход надежнее.
Как построить два графика рядом?
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)). Первый аргумент — строки, второй — столбцы. Каждый ax настраивается отдельно.
Как сохранить график в файл?
fig.savefig('chart.png', dpi=150, bbox_inches='tight'). dpi — разрешение, bbox_inches='tight' — обрезает лишние поля.
Больше вопросов для подготовки — в разделе примеров.
Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.
FAQ
Нужен ли matplotlib, если есть seaborn?
Да. seaborn не покрывает все сценарии — кастомные аннотации, сложные subplots, тонкая настройка осей. Плюс seaborn возвращает объекты matplotlib, и для их доводки нужно знать API matplotlib.
Какую версию matplotlib ставить?
Ставьте последнюю стабильную: pip install matplotlib. Для Jupyter добавьте %matplotlib inline в начало ноутбука. Если работаете в Colab — matplotlib уже установлен.
Как сделать графики красивее без seaborn?
Используйте стили: plt.style.use('seaborn-v0_8-whitegrid') или plt.style.use('ggplot'). Список доступных стилей — plt.style.available. Это меняет шрифты, фон, сетку одной строкой.
matplotlib или plotly?
matplotlib — статичные графики для отчётов и презентаций. plotly — интерактивные графики для дашбордов. На собеседовании аналитика обычно спрашивают matplotlib, потому что он стандарт и не требует инфраструктуры для отображения.