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, потому что он стандарт и не требует инфраструктуры для отображения.