Числа в таблицах и массивах не всегда дают полную картину. Распределение признаков, тренды, выбросы и связи между переменными гораздо проще увидеть на графике. В аналитике и машинном обучении визуализация - не украшение, а рабочий инструмент: с её помощью проверяют качество данных, выбирают признаки и объясняют результаты.
Две главные библиотеки для графиков в Python - matplotlib и seaborn. Matplotlib даёт низкоуровневый контроль над каждым элементом рисунка. Seaborn строится поверх matplotlib и добавляет удобные статистические сюжеты и стильное оформление «из коробки». На этом уроке разберём обе и научимся строить графики осознанно.
Matplotlib - это библиотека для построения двумерной графики. Её создали для научной визуализации: графики функций, гистограммы, scatter-диаграммы, кривые потерь при обучении моделей. Библиотека очень гибкая: можно настроить подписи осей, легенду, сетку, размер фигуры и сохранить результат в файл.
Стандартный способ работы - через подмодуль matplotlib.pyplot, который обычно импортируют как import matplotlib.pyplot as plt. После этого вызовы вроде plt.plot(), plt.xlabel() и plt.show() позволяют быстро нарисовать график и вывести его на экран или сохранить.
В matplotlib у каждого графика есть фигура (figure) и одна или несколько осей (axes). Фигура - это «холст», на котором размещаются оси. Оси - это область с координатами, подписями и самими линиями или точками. Когда вызываешь plt.plot() без явного указания осей, библиотека создаёт фигуру и оси по умолчанию.
Явное создание фигуры и осей даёт контроль над компоновкой: несколько графиков в одном окне (subplots), разный размер и расположение. Команда plt.subplots(2, 1) создаёт две оси одна под другой - удобно для сравнения двух рядов данных.
Самый частый сценарий - построить линию по массивам 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.hist(data, bins=20). Параметр bins задаёт число столбцов. Гистограмма показывает, как часто значения попадают в каждый интервал - это основа для проверки нормальности и поиска выбросов.
Чтобы увидеть связь между двумя переменными, подходит scatter-диаграмма: plt.scatter(x, y). Каждая точка - пара значений. По форме облака точек можно судить о корреляции и наличии кластеров. Оба типа графиков часто комбинируют с подписями осей и легендой.
График можно показать в окне вызовом plt.show(). В скриптах часто сохраняют результат в файл: plt.savefig('plot.png') или plt.savefig('plot.pdf', dpi=150). Важно вызывать savefig до show(), потому что show() может очистить фигуру. Для плотных отчётов полезно задать dpi (точек на дюйм) и формат.
Один и тот же набор вызовов можно использовать и в интерактивной среде (Jupyter), и в скрипте: в ноутбуке график выводится в ячейку, в скрипте - в окно или файл. Стиль кода при этом не меняется.
Seaborn - это библиотека для статистической визуализации, построенная поверх matplotlib. Она не заменяет matplotlib, а дополняет его: использует те же фигуры и оси, но добавляет готовые темы оформления и функции для типичных сюжетов - распределения, регрессии, тепловые карты, boxplot и т.д.
Импорт обычно такой: import seaborn as sns. После sns.set_theme() все последующие графики matplotlib автоматически получают стиль seaborn: приятные цвета, сетку, размер шрифтов. Можно строить график целиком через seaborn (например sns.lineplot()) или рисовать через matplotlib, а 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 принимают параметр data=df и имена столбцов как строки: sns.scatterplot(x='col_x', y='col_y', data=df). Так не нужно вручную извлекать массивы - библиотека сама берёт данные из DataFrame. Это особенно удобно в связке с pandas: загрузил таблицу, сразу строишь графики по столбцам.
Matplotlib чаще работает с массивами (списки, NumPy). Seaborn одинаково хорошо умеет и массивы, и DataFrame. Выбор между ними часто такой: быстрый «сырой» график - 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, при необходимости донастраивай через объект осей. В следующем блоке закрепим это заданиями и практикой с автопроверкой.
Сопоставьте функцию и её назначение
Что обычно делают перед выводом графика? Выберите верные варианты
Расставьте шаги по порядку (от начала к концу)
Какой библиотекой задают стиль оформления для всех последующих графиков в скрипте?
Нужно нарисовать кривую потерь (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 означает:
Подготовьте файл plot_task.py и загрузите его на проверку. Цель - построить хотя бы один график с помощью matplotlib и по желанию seaborn.
matplotlib.pyplot as plt.plt.plot), гистограмму (plt.hist) или scatter (plt.scatter) - с любыми данными (список, массив NumPy).plt.xlabel или plt.ylabel).plt.show() или plt.savefig('...') (хотя бы один из них).sns.set_theme() перед построением графика.Загрузите файл Python для проверки