Визуализация данных

Зачем нужны графики в Python

Числа в таблицах и массивах не всегда дают полную картину. Распределение признаков, тренды, выбросы и связи между переменными гораздо проще увидеть на графике. В аналитике и машинном обучении визуализация - не украшение, а рабочий инструмент: с её помощью проверяют качество данных, выбирают признаки и объясняют результаты.

Две главные библиотеки для графиков в Python - matplotlib и seaborn. Matplotlib даёт низкоуровневый контроль над каждым элементом рисунка. Seaborn строится поверх matplotlib и добавляет удобные статистические сюжеты и стильное оформление «из коробки». На этом уроке разберём обе и научимся строить графики осознанно.

Александр
Наконец разберём, как из цифр сделать нормальные картинки.
matplotlib

Что такое matplotlib и откуда он взялся

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

Стандартный способ работы - через подмодуль matplotlib.pyplot, который обычно импортируют как import matplotlib.pyplot as plt. После этого вызовы вроде plt.plot(), plt.xlabel() и plt.show() позволяют быстро нарисовать график и вывести его на экран или сохранить.

matplotlib

Фигура и оси - основа любого графика

В matplotlib у каждого графика есть фигура (figure) и одна или несколько осей (axes). Фигура - это «холст», на котором размещаются оси. Оси - это область с координатами, подписями и самими линиями или точками. Когда вызываешь plt.plot() без явного указания осей, библиотека создаёт фигуру и оси по умолчанию.

Явное создание фигуры и осей даёт контроль над компоновкой: несколько графиков в одном окне (subplots), разный размер и расположение. Команда plt.subplots(2, 1) создаёт две оси одна под другой - удобно для сравнения двух рядов данных.

Живой пример - минимальный график
matplotlib

Линейный график - plt.plot

Самый частый сценарий - построить линию по массивам x и y. Вызов plt.plot(x, y) рисует линию, соединяющую точки. Можно передать только один массив: тогда по горизонтали будут индексы 0, 1, 2, ... Добавление третьего аргумента вроде 'g--' задаёт цвет и тип линии (зелёная пунктирная).

Перед выводом графика обычно вызывают plt.xlabel('Ось X'), plt.ylabel('Ось Y'), при необходимости plt.title('Заголовок') и plt.legend(), если на графике несколько линий с подписями. Завершает вывод plt.show() или plt.savefig('file.png').

Мария
А что если нужно несколько линий на одном графике?
Дмитрий
Просто несколько раз вызвать plt.plot() с разными данными - все линии появятся на одних осях. Не забудь label= для легенды.
matplotlib

Гистограмма и scatter

Для распределения одной величины используют гистограмму: plt.hist(data, bins=20). Параметр bins задаёт число столбцов. Гистограмма показывает, как часто значения попадают в каждый интервал - это основа для проверки нормальности и поиска выбросов.

Чтобы увидеть связь между двумя переменными, подходит scatter-диаграмма: plt.scatter(x, y). Каждая точка - пара значений. По форме облака точек можно судить о корреляции и наличии кластеров. Оба типа графиков часто комбинируют с подписями осей и легендой.

Живой пример - тип графика
matplotlib

Сохранение и отображение

График можно показать в окне вызовом plt.show(). В скриптах часто сохраняют результат в файл: plt.savefig('plot.png') или plt.savefig('plot.pdf', dpi=150). Важно вызывать savefig до show(), потому что show() может очистить фигуру. Для плотных отчётов полезно задать dpi (точек на дюйм) и формат.

Один и тот же набор вызовов можно использовать и в интерактивной среде (Jupyter), и в скрипте: в ноутбуке график выводится в ячейку, в скрипте - в окно или файл. Стиль кода при этом не меняется.

seaborn

Что такое seaborn и чем он отличается от matplotlib

Seaborn - это библиотека для статистической визуализации, построенная поверх matplotlib. Она не заменяет matplotlib, а дополняет его: использует те же фигуры и оси, но добавляет готовые темы оформления и функции для типичных сюжетов - распределения, регрессии, тепловые карты, boxplot и т.д.

Импорт обычно такой: import seaborn as sns. После sns.set_theme() все последующие графики matplotlib автоматически получают стиль seaborn: приятные цвета, сетку, размер шрифтов. Можно строить график целиком через seaborn (например sns.lineplot()) или рисовать через matplotlib, а seaborn только задаёт стиль.

seaborn

Типы графиков в seaborn

Seaborn предлагает функции под типичные задачи аналитики. sns.histplot(data=x) - гистограмма с опциональным KDE (оценка плотности). sns.scatterplot(x=..., y=..., data=df) строит scatter по столбцам DataFrame и может раскрашивать точки по третьей переменной. sns.lineplot() удобен для временных рядов с доверительными интервалами.

Boxplot и violin: sns.boxplot(x=..., y=..., data=df) показывает медиану, квартили и выбросы по группам. sns.violinplot() даёт форму распределения по группам. Оба незаменимы для сравнения распределений между категориями.

Живой пример - seaborn и данные
Ольга
То есть seaborn лучше, когда данные в виде таблицы (DataFrame)?
seaborn

Seaborn и табличные данные

Да, многие функции seaborn принимают параметр data=df и имена столбцов как строки: sns.scatterplot(x='col_x', y='col_y', data=df). Так не нужно вручную извлекать массивы - библиотека сама берёт данные из DataFrame. Это особенно удобно в связке с pandas: загрузил таблицу, сразу строишь графики по столбцам.

Matplotlib чаще работает с массивами (списки, NumPy). Seaborn одинаково хорошо умеет и массивы, и DataFrame. Выбор между ними часто такой: быстрый «сырой» график - matplotlib; аккуратная статистическая картинка с группировкой - seaborn.

Александр
Запомнил: pandas даёт таблицу, seaborn рисует по ней.
Связка

matplotlib и seaborn вместе

На практике их используют в одном проекте. Сначала вызывают sns.set_theme(), чтобы все графики получили единый стиль. Дальше можно рисовать только через plt - стиль уже применён. Или вызывать sns.lineplot(), sns.histplot() - внутри seaborn создаёт фигуру и оси через matplotlib и добавляет свой слой.

Тонкая настройка всё равно через matplotlib: после вызова функции seaborn получаешь объект осей (axes). Можно вызвать ax.set_title(), ax.set_xlabel() и т.д. Так совмещаются удобство seaborn и гибкость matplotlib.

Практика

Типичные ошибки при построении графиков

Частая ошибка - забыть plt.show() в скрипте и не увидеть график (в Jupyter он может появиться и без явного show, но в .py-файле - нет). Другая - смешивать интерфейс: создал оси через fig, ax = plt.subplots(), а потом вызываешь plt.plot() вместо ax.plot() - в простом случае сработает, но при нескольких subplots можно нарисовать не на той оси.

Имеет смысл придерживаться одного подхода: либо везде plt., либо явно работать с объектом ax. Для отладки полезно вызывать plt.show() после каждого графика или сохранять в файл и смотреть результат.

Применение

Графики в аналитике и машинном обучении

В аналитике графики нужны для разведки данных: как распределены признаки, есть ли выбросы, как связаны переменные. Гистограммы и boxplot по столбцам - первый шаг перед обучением модели. В машинном обучении кривая потерь (loss) по эпохам - классический график через plt.plot(epochs, losses).

Визуализация не только объясняет результат, но и помогает принять решение: какой признак убрать, какую модель выбрать, на какой эпохе остановить обучение. Поэтому умение строить графики в matplotlib и seaborn - обязательный навык для работы с данными.

Дмитрий
То есть сначала смотрим на данные глазами, потом уже обучаем.
Итог теории

Что вынести из урока

Matplotlib - основа: фигура, оси, plot, hist, scatter, подписи, show() и savefig(). Seaborn - статистическая визуализация поверх matplotlib: темы, lineplot, histplot, scatterplot, boxplot, удобная работа с DataFrame.

Используй их вместе: установи стиль через seaborn, строй графики через sns или plt, при необходимости донастраивай через объект осей. В следующем блоке закрепим это заданиями и практикой с автопроверкой.

Мария
Готова к интерактивам. Хочу проверить, что запомнила про типы графиков.

Интерактив 1 - сопоставьте тип графика и задачу

Сопоставьте функцию и её назначение

plt.plot()
plt.hist()
plt.scatter()
sns.boxplot()

Что обычно делают перед выводом графика? Выберите верные варианты

Интерактив 2 - порядок действий при построении графика

Расставьте шаги по порядку (от начала к концу)

Импортировать matplotlib.pyplot as plt
Подготовить данные (массивы x, y или DataFrame)
Вызвать функцию графика (plot, hist, scatter и т.д.)
Подписать оси (xlabel, ylabel) и при необходимости title
Вызвать plt.show() или plt.savefig()

Какой библиотекой задают стиль оформления для всех последующих графиков в скрипте?

Интерактив 3 - выбор библиотеки и типа графика

Нужно нарисовать кривую потерь (loss по эпохам). Что логичнее?

Нужно сравнить распределение признака в трёх группах (категориальная переменная). Что уместнее?

Seaborn построен поверх matplotlib?

Финальный допуск

Ответьте минимум на 8 из 10 вопросов правильно, чтобы открыть практику.

1. Как обычно импортируют matplotlib для построения графиков?

2. Что рисует plt.hist(data)?

3. Для чего чаще всего используют plt.scatter(x, y)?

4. Как задать единый стиль для графиков в скрипте через seaborn?

5. Что создаёт plt.subplots(2, 1)?

6. Как сохранить график в файл?

7. Seaborn построен поверх какой библиотеки?

8. Какой тип графика в seaborn удобен для сравнения распределений по группам?

9. Что нужно вызвать в скрипте, чтобы график отобразился в окне?

10. Параметр data=df в функциях seaborn означает:

Практика - график с matplotlib и seaborn

Подготовьте файл plot_task.py и загрузите его на проверку. Цель - построить хотя бы один график с помощью matplotlib и по желанию seaborn.

  • Импортируйте matplotlib.pyplot as plt.
  • Постройте хотя бы один график: линейный (plt.plot), гистограмму (plt.hist) или scatter (plt.scatter) - с любыми данными (список, массив NumPy).
  • Подпишите ось X или ось Y (хотя бы одну через plt.xlabel или plt.ylabel).
  • Вызовите plt.show() или plt.savefig('...') (хотя бы один из них).
  • Дополнительно (не обязательно для зачёта): импортируйте seaborn и вызовите sns.set_theme() перед построением графика.
Порог зачёта - 70 баллов. Проверка смотрит на наличие импорта pyplot, вызова функции графика, подписи оси и show/savefig.
import matplotlib.pyplot as plt # Пример: линейный график x = [1, 2, 3, 4, 5] y = [2, 4, 3, 5, 4] plt.plot(x, y) plt.xlabel('X') plt.ylabel('Y') plt.show()

Загрузите файл Python для проверки