Вы прочитали 2 из 3 бесплатных методичек сегодня
Безлимит →
Экстракт 19 июня 2019

Мастерство объектно-ориентированной визуализации: создавайте сложные графики с помощью Matplotlib Subplots

Corey Schafer · Corey Schafer Верифицирован 21:22

Освоение метода subplots для создания профессиональных многооконных графиков в Python. Видео рассчитано на аналитиков и Data Scientists, желающих перейти от простого скриптинга к гибкому ООП-стилю визуализации за 21 минуту.

⚡ Зачем читать

  • Переход к профессиональному уровню: Забудьте о случайных ошибках «stateful» программирования; ООП-стиль — это стандарт индустрии для создания воспроизводимых отчетов.
  • Контроль над пространством: Научитесь управлять сетками графиков любой сложности, чтобы уместить все инсайты вашего анализа на одном экране.
  • Автоматизация отчетов: Освойте сохранение отдельных графиков программно, превращая рутинную выгрузку визуализаций в элегантный автоматизированный процесс.
7 тезисов 4 задания 5 цитат ⏱ 17 мин чтения 🎯 7 тезисов
YouTube Транскрипт Сохранить
Поделиться: TG WA VK X

Для AI-агентов и LLM

Экстракт доступен в структурированном Markdown. Скачать .md · JSON API · Site index

💡 Ключевые тезисы (7)

1 Откажитесь от stateful-подхода в пользу ООП #
Перестаньте полагаться на текущее состояние pyplot (stateful). Переход к объектно-ориентированному стилю позволяет явно управлять каждым графиком (axes) и контейнером (figure), что критически важно для сложных отчетов.
2 Инициализируйте структуру через subplots #
Используйте метод plt.subplots(), чтобы одновременно создать объект фигуры и массив осей. Это дает контроль над расположением графиков до начала отрисовки данных.
3 Применяйте методы set_* вместо функций верхнего уровня #
Замените вызовы plt.title() и plt.xlabel() на ax.set_title() и ax.set_xlabel(). Это позволяет точечно настраивать каждый subplot, не конфликтуя с остальными элементами визуализации.
4 Настраивайте размерность сетки #
Управляйте расположением графиков через аргументы nrows и ncols внутри subplots. Это позволяет превратить один график в сложную панель из нескольких связанных или независимых визуализаций.
5 Распаковывайте объекты осей #
Освойте деструктуризацию списка осей, возвращаемого методом subplots, для прямого доступа к конкретному графику (например, ax1, ax2 = plt.subplots(2, 1)).
6 Синхронизируйте оси через sharex и sharey #
Используйте аргументы sharex=True или sharey=True, чтобы очистить визуальный шум. Это избавит график от дублирующихся подписей делений на смежных осях.
7 Разделяйте данные по разным фигурам #
Создавайте отдельные экземпляры фигур, если графики не должны быть связаны общей компоновкой. Это упрощает экспорт каждого отчета в индивидуальный файл.

Мастерство объектно-ориентированной визуализации: создавайте сложные графики с помощью Matplotlib Subplots

🗺 Карта навыков

Навык Уровень Цель
Stateful vs OO Начальный Переход от plt к fig, ax
Управление осями Средний Использование subplots() и индексов
Синхронизация Средний Работа с sharex и sharey
Мульти-фигуры Продвинутый Управление несколькими окнами и сохранение

1. Отказ от stateful-подхода в пользу ООП

В начале своего пути в Data Science многие начинают с использования процедурного стиля Matplotlib, который спикер Corey Schafer называет «stateful». В этом подходе вы полагаетесь на неявное состояние: вы вызываете plt.plot(), plt.title(), и Matplotlib «сам» догадывается, на каком графике рисовать. Это кажется удобным, пока ваш скрипт ограничивается одним окном. Однако, как только возникает задача создать отчет с несколькими подграфиками, такой стиль превращается в «спагетти-код», где управление текущим активным окном становится источником ошибок.

Переход к объектно-ориентированному (ООП) стилю радикально меняет подход к разработке. Вместо того чтобы полагаться на глобальный объект plt, вы работаете с конкретными экземплярами объектов: figure (фигура-контейнер) и axes (оси или конкретные графики внутри). В примере из видео Corey демонстрирует, как заменить вызовы plt.plot() на ax.plot(). Это фундаментальный сдвиг в мышлении: вы больше не «просите» систему что-то сделать с текущим состоянием, вы «даете команду» конкретному объекту осей визуализировать ваши данные.

Кори отмечает: «Так как мы используем этот PI plot объект, у него есть текущее состояние относительно того, с какой фигурой и осями мы работаем. Это то, что мы называем stateful-подходом». Этот стиль становится ограничивающим, когда нужно динамически менять атрибуты нескольких графиков одновременно. При использовании ООП-метода fig, ax = plt.subplots() вы получаете явный доступ к каждому элементу. Это позволяет вам, например, создать десять графиков в цикле, сохранить ссылку на каждый из них в список и управлять ими индивидуально, не опасаясь того, что Matplotlib перепутает, какой график сейчас «текущий».

Более того, методы настройки, такие как set_title(), set_xlabel() и set_ylabel(), созданы специально для этого стиля. В процедурном стиле мы бы использовали plt.title(), который всегда относится к последнему созданному объекту. В ООП-стиле вы вызываете ax.set_title(), что делает код самодокументированным: вы четко видите, какой объект получает заголовок. Это значительно упрощает отладку, особенно в сложных дашбордах, где вы можете забыть, какой график является активным на текущей итерации кода.

"Так как мы используем этот PI plot объект, у него есть текущее состояние относительно того, с какой фигурой и осями мы работаем. Это то, что мы называем stateful-подходом, и многие люди предпочитают, включая меня, использовать более объектно-ориентированный подход при работе с несколькими фигурами и осями."

Сделайте сейчас: Перепишите ваш последний скрипт с использованием fig, ax = plt.subplots(). Замените все plt.plot() на ax.plot() и все plt.title() на ax.set_title(). Убедитесь, что график отображается корректно, а затем добавьте настройку ax.set_xlabel('Age').

2. Инициализация и настройка структуры сетки через subplots

Метод plt.subplots() является «швейцарским ножом» в визуализации Matplotlib. По умолчанию он создает одну фигуру и одну область осей, но его истинная сила проявляется при работе с многооконными структурами. Кори Шафер показывает, как аргументы nrows и ncols позволяют нам разбивать пространство окна на сетку любой конфигурации. Например, plt.subplots(nrows=2, ncols=1) создает вертикальную стопку из двух графиков. Важно понимать, что возвращаемое значение метода зависит от количества запрошенных осей: если это 1x1, вы получаете объект оси; если это 2x1, вы получаете массив (список) осей.

Это создает необходимость в деструктуризации (распаковке) объектов. Кори использует запись ax1, ax2 = plt.subplots(2, 1), чтобы сразу получить доступ к верхнему и нижнему графикам. Это позволяет логически разделить данные: например, на ax1 поместить «Всех разработчиков», а на ax2 — «Python и JavaScript разработчиков». Такой подход позволяет избежать перегруженности одного графика, где три линии могли бы сливаться в кашу. Разбиение данных на независимые, но логически связанные блоки — это навык, отличающий профессионального аналитика от новичка.

Когда мы создаем сетку, возникает проблема дублирования визуальной информации, такой как подписи осей X или деления (ticks). Если два графика показывают данные по одним и тем же возрастам, зачем подписывать ось X дважды? Здесь на помощь приходит аргумент sharex=True. Кори демонстрирует, как эта маленькая настройка позволяет Matplotlib «понять», что оси X связаны, и автоматически скрыть лишние подписи на верхних графиках. Это делает график гораздо чище и позволяет зрителю сосредоточиться на данных, а не на повторяющемся тексте.

Кроме того, понимание структуры возвращаемых данных важно, когда сетка становится сложной, например, 2x2. В этом случае plt.subplots() возвращает список списков, где доступ к осям осуществляется через индексы, например ax[0, 1]. Знание того, как распаковать этот массив, дает вам полный контроль над тем, где именно появится каждый фрагмент вашего анализа. Кори делает акцент на том, что этот метод работает не только для удобства, но и для профессиональной автоматизации, позволяя генерировать десятки графиков, сохраняя их как отдельные файлы через fig.savefig().

"Если мы хотим иметь больше чем один график, нам нужно больше осей. Метод subplots — это именно то место, где мы задаем количество строк и колонок. Использование аргументов sharex и sharey позволяет нам сделать график более чистым, избавляясь от дублирующейся информации на смежных осях."

Сделайте сейчас: Создайте сетку 2x1, используя fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex=True). Постройте на ax1 данные о зарплатах Python-разработчиков, а на ax2 — JavaScript-разработчиков. Убедитесь, что ось X подписана только на нижнем графике.


3. Синхронизация осей через sharex и sharey

Когда мы создаем многооконные визуализации, например, сетку 2x1 или 2x2, мы часто сталкиваемся с проблемой избыточности. Если на верхнем графике отображаются данные по временной шкале (возраст от 18 до 65 лет) и на нижнем графике используется та же шкала, то наличие подписей делений (ticks) и меток оси X (xlabel) на обоих графиках создает визуальный шум. Это не только перегружает дизайн, но и усложняет восприятие информации, заставляя пользователя дважды считывать одну и ту же ось. Кори Шафер в своем уроке делает акцент на методах оптимизации пространства через параметры sharex и sharey.

Аргументы sharex=True и sharey=True, передаваемые в функцию plt.subplots(), позволяют Matplotlib связать оси между собой. В примере с графиками зарплат разработчиков, установка sharex=True автоматически скрывает дублирующиеся подписи на верхних графиках, оставляя их только на нижнем. Это создает эффект «единой оси» для всех графиков в столбце. Кори отмечает, что это делает график «nice and cleaned up» (приятным и аккуратным) по сравнению с тем, как это выглядело бы без использования данных аргументов. Такая настройка — признак внимания к деталям, который выделяет качественную аналитическую работу.

Разбор механизма работы sharex и sharey открывает более глубокое понимание того, как устроена библиотека. Когда вы активируете sharex, Matplotlib не просто прячет текст; он синхронизирует границы (limits) осей. Если вы попытаетесь изменить масштаб (zoom) на одном графике, с которым синхронизированы другие, остальные графики автоматически подстроятся под это изменение. Это невероятно полезно для исследовательского анализа данных (EDA), когда вам нужно сравнить поведение разных метрик на одном и том же временном отрезке или диапазоне значений. Представьте, что вы анализируете аномалии в финансовых данных: синхронизация позволяет вам мгновенно видеть, как скачок на одном графике коррелирует с провалом на другом, не «перепрыгивая» глазами между осями.

Более того, использование sharey=True особенно полезно при создании графиков для сравнения распределений. Если у вас есть две группы данных, которые вы хотите сопоставить, наличие общей оси Y позволяет мгновенно оценить относительную величину значений. Без этой синхронизации Matplotlib автоматически масштабирует каждый график под его собственные данные (min/max), из-за чего один график может визуально выглядеть больше другого, хотя абсолютные значения могут быть сопоставимы. Принудительная синхронизация через sharey=True избавляет от таких ложных интерпретаций и делает сравнение честным.

"Если мы хотим иметь более чистый график и избавиться от дублирующейся информации на смежных осях, мы можем использовать параметры sharex и sharey. Они позволяют Matplotlib понять, что оси связаны, и автоматически скрыть лишние подписи на верхних или левых графиках, оставляя их только там, где это необходимо для понимания контекста."

Сделайте сейчас: Возьмите код с двумя графиками (например, зарплаты Python и JS разработчиков). Установите sharex=True в вызове plt.subplots(2, 1, sharex=True). Убедитесь, что метки оси X исчезли с верхнего графика, а при изменении диапазона данных (ax1.set_xlim(20, 30)) масштаб синхронизируется на обоих графиках.

4. Разделение данных по разным фигурам и программный экспорт

Иногда логика вашего анализа требует, чтобы графики не просто находились на разных осях внутри одного окна, а были полностью независимыми объектами. Это бывает необходимо, когда вы создаете отчеты для разных стейкхолдеров или когда графики содержат настолько разную информацию, что объединение их в одну фигуру перегрузит восприятие. В Matplotlib переход к ООП-стилю позволяет легко управлять созданием нескольких объектов figure параллельно. Вместо того чтобы пытаться уместить всё в одну сетку, вы просто инстанцируете два разных объекта fig1 и fig2, используя отдельные вызовы plt.subplots().

Кори Шафер демонстрирует, как создать два независимых окна, просто вызвав функцию дважды. Это дает вам полную свободу в именовании и настройке каждой фигуры: у каждой может быть свой размер (параметр figsize), свой заголовок и свой стиль. Это особенно важно для автоматизированных скриптов, которые анализируют огромные объемы данных и генерируют десятки графиков за один прогон. В таких задачах вы не «смотрите» на графики, вы их «создаете и сохраняете». Кори подчеркивает: «Это было бы отлично для автоматизации анализа данных, где вы строите графики в фоновом скрипте, а затем просто сохраняете их в файловую систему».

Процесс сохранения визуализаций становится элегантным при использовании метода savefig(). В процедурном стиле вам пришлось бы постоянно переключаться между активными окнами с помощью plt.figure(n), что является крайне ненадежным и трудноотлаживаемым процессом. В объектно-ориентированном стиле, имея переменную fig1, вы просто вызываете fig1.savefig('salary_python.png'). Это делает ваш код предсказуемым: вы точно знаете, какой объект записывается в какой файл. Такая практика превращает ваш код из набора «рисунков» в надежный инструмент подготовки отчетности.

Кроме того, независимые фигуры позволяют вам более гибко управлять форматом вывода. Вы можете сохранить один график в высоком разрешении для презентации (используя dpi=300), а другой — в облегченном формате для веб-дашборда. ООП-подход дает вам возможность применять разные настройки к объектам figure до их сохранения, не влияя на другие компоненты программы. Это создает модульную архитектуру, где каждый «кусок» визуализации может быть протестирован и настроен независимо.

Наконец, стоит отметить, что управление несколькими окнами требует дисциплины в именовании переменных. Использование понятных имен, таких как fig_dev_salary или fig_tech_comparison, вместо абстрактных fig1, fig2, сделает ваш код более читаемым и поддерживаемым в долгосрочной перспективе. Кори Шафер неоднократно подчеркивает, что именно этот уровень контроля делает Matplotlib мощным инструментом для Data Scientist'а, а не просто библиотекой для создания простых графиков.

"Использование нескольких объектов фигур позволяет нам гибко управлять выводом для разных целей. Мы можем легко сохранить каждый график в отдельный файл, используя метод savefig для конкретного объекта, что делает процесс автоматизации отчетов надежным и предсказуемым, устраняя необходимость в ручном управлении текущим активным состоянием системы."

Сделайте сейчас: Создайте два отдельных скрипта-примера: один для анализа зарплат Python-разработчиков (сохраните его в python_salaries.png), а другой для JavaScript-разработчиков (сохраните в js_salaries.png). Используйте fig1.savefig() и fig2.savefig() соответственно. Проверьте вашу папку после выполнения кода, чтобы убедиться, что файлы были созданы успешно.


5. Работа со сложными сетками: индексация и деструктуризация

Когда ваш аналитический проект требует не просто сравнения двух графиков, а создания сложной панели визуализации, например, сетки 2x2, привычный подход с переменными ax1 и ax2 становится недостаточно гибким. Метод plt.subplots(nrows=2, ncols=2) возвращает объект осей, который представляет собой двумерный массив (матрицу) объектов Axes. Понимание того, как обращаться к элементам этой структуры, является ключевым навыком для профессионального построения дэшбордов на Matplotlib. Кори Шафер подчеркивает, что эта матричная структура позволяет автоматизировать отрисовку: вместо того чтобы вручную прописывать логику для каждого окна, вы можете использовать циклы for для итерации по осям, что делает код лаконичным и устойчивым к изменениям параметров сетки.

В примере с сеткой 2x2, fig, ax = plt.subplots(2, 2) вернет ax как массив numpy. Доступ к верхнему левому графику осуществляется через ax[0, 0], к нижнему правому — через ax[1, 1]. Кори отмечает: «Когда у вас появляется много осей, важно понимать, что Matplotlib возвращает их в виде массива, и вы должны уметь извлекать их, используя стандартную индексацию массивов Python». Это дает вам возможность динамически настраивать заголовки или цвета линий для каждого квадрата сетки, обращаясь к ним через индексы в цикле. Это особенно полезно, когда вы строите, например, четыре разных типа графиков (линейный, столбиковый, гистограмму и диаграмму рассеяния) в рамках одного отчета.

Более того, если ваша сетка становится еще более сложной (например, 3x3), ручная распаковка ax1, ax2, ax3... = ax становится утомительной и приводит к ошибкам. Метод «плоского» доступа ax.flatten() превращает двумерный массив осей в одномерный список, что позволяет легко обходить все графики с помощью простого цикла for ax in axes.flatten():. Это мастерский прием, который используют опытные разработчики для применения глобальных стилей (например, ax.grid(True)) ко всем графикам сразу, экономя десятки строк кода.

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

Сделайте сейчас: Создайте сетку 2x2. С помощью цикла for по ax.flatten() добавьте сетку (grid) на каждый график и установите заголовки "График 1", "График 2" и т.д. Постройте разные типы графиков (например, sin, cos, random) в каждой ячейке.

6. Использование tight_layout() для предотвращения наложения элементов

Частая проблема при создании многооконных графиков — это перекрытие подписей осей, заголовков и самих графиков. Когда вы создаете сетку, Matplotlib по умолчанию не всегда учитывает длину текста меток, что приводит к «обрезанию» подписей или наложению текста одного графика на другой. Метод plt.tight_layout() является «секретным оружием» (как называет его Кори Шафер) для автоматического исправления этой проблемы. Это не просто косметическая правка; это способ гарантировать, что ваш отчет будет выглядеть профессионально вне зависимости от длины названий меток или заголовков.

Кори подробно объясняет, что tight_layout() анализирует размеры всех элементов внутри фигуры — меток, тиков, заголовков — и автоматически рассчитывает необходимые отступы, чтобы они не пересекались. Без этого метода вам пришлось бы вручную задавать параметры subplots_adjust(), что крайне сложно поддерживать, так как при изменении шрифта или данных вам пришлось бы пересчитывать отступы заново. tight_layout() делает это динамически: «Этот метод автоматически подгоняет все подписи, чтобы они не перекрывались, и это то, что я использую почти в каждом своем графике, чтобы убедиться, что все выглядит аккуратно». Это делает вашу работу независимой от внешних условий отрисовки.

Более продвинутый уровень использования — это управление отступами через параметры rect или pad внутри tight_layout(), если вы планируете добавить общее название для всей фигуры через fig.suptitle(). Иногда автоматика может быть «слишком тесной», и небольшая настройка позволяет оставить место для главного заголовка всей страницы. Этот подход избавляет от необходимости «подгонять» график вручную, превращая процесс верстки визуализации в предсказуемый и автоматизированный конвейер.

Помимо этого, правильное использование отступов критически важно для экспорта графиков в PDF или PNG. Если вы сохраняете график без tight_layout(), вы часто обнаруживаете, что важные части легенды или названия осей обрезаны краями изображения. Применение этого метода перед fig.savefig() гарантирует, что каждый пиксель вашего анализа будет виден на итоговом изображении. Это — стандарт индустрии для создания отчетов высокого качества, которые не стыдно отправить коллегам или включить в презентацию для руководства.

"Метод tight_layout — это ваш лучший друг при работе с несколькими графиками. Он берет на себя всю тяжелую работу по расчету отступов, гарантируя, что ваши оси и заголовки не будут накладываться друг на друга, превращая даже самую сложную сетку в чистое и понятное визуальное представление данных."

Сделайте сейчас: Создайте сетку 2x2 с длинными названиями осей (например, "Распределение зарплат по регионам (USD)"). Попробуйте вывести график БЕЗ tight_layout() и посмотрите, как обрежутся подписи. Затем добавьте plt.tight_layout() и сохраните результат, чтобы увидеть разницу в профессиональном оформлении.


7. Синхронизация осей: sharex и sharey для чистоты данных

Когда вы строите панели из нескольких графиков, представляющих данные с общим временным рядом или одной и той же шкалой, возникает проблема визуального шума. Повторяющиеся метки делений (ticks) на каждой оси захламляют пространство, затрудняя сравнение значений между разными графиками. Здесь на помощь приходят аргументы sharex=True и sharey=True в методе plt.subplots(). Кори Шафер подчеркивает: «Когда вы используете sharex=True, Matplotlib интеллектуально понимает, что оси связаны, и автоматически скрывает дублирующиеся метки на внутренних графиках, оставляя их только на нижнем или левом краю». Это позволяет сфокусировать внимание зрителя на самих данных, а не на повторяющихся цифрах, которые только отвлекают.

Применение синхронизации осей не просто «прячет» текст; оно настраивает связи между осями таким образом, что при масштабировании (zoom) одного графика остальные синхронно следуют за ним. Это критически важно при интерактивном анализе временных рядов, где вы хотите проследить поведение разных показателей (например, цены акций и объема торгов) в один и тот же момент времени. Кори отмечает, что без этой функции вам пришлось бы настраивать пределы каждой оси вручную через set_xlim(), что крайне неэффективно. Использование sharex делает ваш дашборд «живым» и согласованным инструментом исследования, а не статичной картинкой.

Более того, синхронизация осей экономит драгоценное место на экране. В профессиональных отчетах плотность информации имеет значение. Когда оси «делят» пространство, вы можете уменьшить отступы между графиками, сохраняя при этом идеальную читаемость. Это мастерский уровень подготовки отчетов: визуальное изящество достигается не за счет удаления данных, а за счет удаления дубликатов. Как говорит Шафер, «это делает ваш отчет профессиональным, чистым и невероятно удобным для считывания данных глазами». Это стандарт для качественной аналитики, где каждый пиксель должен работать на понимание сути данных.

"Использование параметров sharex и sharey позволяет нам создавать связанные визуализации, где масштабирование и подписи осей работают как единый механизм. Это не только избавляет от визуального хаоса и дублирования подписей, но и делает ваши графики интерактивными и готовыми к глубокому исследовательскому анализу, превращая разрозненные окна в единую аналитическую панель."

Сделайте сейчас: Постройте два графика (на двух строках), отображающих разные функции (например, экспоненту и логарифм) от одного и того же диапазона X. Сравните результат с sharex=False (по умолчанию) и sharex=True. Заметьте, как исчезают лишние метки на верхнем графике, делая сетку чище.

8. Автоматизация отчетности: жизненный цикл объекта Figure

В завершение нашего погружения в Matplotlib, важно осознать жизненный цикл объекта figure. В ООП-подходе figure — это контейнер, «холст», на котором вы разворачиваете свои визуализации. В отличие от процедурного стиля, где вы «рисуете» на невидимом текущем объекте, здесь вы управляете объектами как переменными. Вы можете создать список фигур, итерироваться по нему и применять пакетную обработку. Это позволяет автоматизировать создание сотен отчетов. Кори Шафер отмечает: «Вы можете создать функцию, которая принимает данные и возвращает объект fig, а затем вызывать эту функцию в цикле для обработки десятков CSV-файлов, сохраняя результат в PDF-отчеты». Это превращает Matplotlib из инструмента рисования в мощный конвейер обработки данных.

Когда вы работаете с большими проектами, важно помнить о закрытии окон. Использование plt.close(fig) после сохранения файла — это гигиена кода, предотвращающая утечки памяти. Каждый созданный объект занимает оперативную память; если вы генерируете тысячи графиков в фоновом скрипте, Matplotlib без контроля может замедлить систему. «Всегда закрывайте свои фигуры, если они вам больше не нужны», — советует Кори. Это правило особенно актуально для серверов или облачных сред, где ресурсы ограничены. Правильное управление памятью гарантирует, что ваш скрипт не упадет на середине выполнения из-за переполнения RAM.

Наконец, ООП-стиль дает вам возможность инкапсулировать логику оформления. Вы можете создать словарь с настройками стиля или функцию, которая принимает ax и применяет к нему корпоративные цвета, шрифты и сетки. Передача объекта ax в функцию-обработчик позволяет вам стандартизировать визуализацию во всем проекте. Вы пишете стиль один раз — и используете его для всех 50 графиков в отчете. Это путь к поддерживаемому коду, где правка одной строки в стиле меняет оформление всего проекта. Это и есть настоящий профессионализм: писать код, который работает на вас, а не вы на него.

"Управление объектами figure и axes в рамках их жизненного цикла дает нам возможность строить масштабируемые системы автоматизированного анализа. Инкапсулируя логику настройки графиков в функции, мы добиваемся единообразия, чистоты кода и высокой производительности наших аналитических конвейеров, делая процесс создания отчетов предсказуемым и воспроизводимым."

Сделайте сейчас: Напишите функцию create_standard_plot(data, title), которая принимает данные и заголовок, создает одну фигуру, рисует на ней график, добавляет заголовок и возвращает объект fig. Затем вызовите её в цикле для трех разных наборов данных и сохраните каждый результат в отдельный файл с помощью fig.savefig().

🏋️ Практикум

  1. Базовый ООП: Перепишите свой старый скрипт (с plt.plot) на использование fig, ax = plt.subplots().
  2. Распаковка: Создайте сетку 3x2 и через деструктуризацию (распаковку) присвойте каждой оси свою переменную (например, ax1, ax2, ... ax6 = axes.flatten()).
  3. Циклы: Используя ax.flatten(), выведите на сетке 2x2 четыре разных математических функции, используя цикл for для итерации по осям.
  4. Синхронизация: Постройте 3 графика в ряд, установив sharey=True. Убедитесь, что метки Y-оси есть только у первого графика.
  5. Очистка: Напишите цикл, который создает 5 графиков, сохраняет их, а затем вызывает plt.close() для каждой фигуры, чтобы освободить память.
  6. Стилизация: Добавьте легенду на каждый график в сетке 2x2, используя ax.legend(), и убедитесь, что tight_layout() не обрезает её края.

🏋️ Практикум

0 / 4 выполнено

Миграция старого кода на subplots

⏱ 15 мин 🎯 Цель: переписать существующий скрипт с plt.plot на объектно-ориентированный стиль. Шаги: 1. Инициализируйте fig, ax. 2. Замените все вызовы plt. на ax.. 3. Используйте методы set_ для заголовков. ✅ Результат: идентичный график, созданный через ООП.

Создание многооконной панели

⏱ 20 мин 🎯 Цель: разделить данные на два ряда графиков. Шаги: 1. Настройте subplots(2, 1). 2. Распакуйте оси. 3. Назначьте разные данные на каждую ось. ✅ Результат: фигура с двумя вертикально расположенными графиками.

Оптимизация сетки через sharex

⏱ 10 мин 🎯 Цель: убрать дублирование меток осей. Шаги: 1. Установите sharex=True в вызове subplots. 2. Удалите лишние set_xlabel для верхнего графика. ✅ Результат: аккуратный макет с общими делениями X.

Автоматизированный экспорт нескольких фигур

⏱ 10 мин 🎯 Цель: сохранить два разных графика в разные файлы. Шаги: 1. Создайте две отдельные переменные фигур. 2. Используйте метод savefig() для каждой. ✅ Результат: два PNG-файла в рабочей директории.
🎉
Все задания выполнены!
Отлично — знания превращены в навыки

💬 Цитаты (5)

«Фигура — это контейнер, удерживающий ваши графики, а оси — это сами графики. Вы можете думать о фигуре как о целом окне, которое появляется при запуске кода.» #

Разъяснение иерархии объектов в Matplotlib.

«Многие люди, включая меня, предпочитают объектно-ориентированный подход, особенно при работе с несколькими графиками и осями одновременно.» #

Обоснование перехода от stateful-методов к профессиональным практикам.

«Если вы хотите использовать subplots, вам нужно заменить вызовы функций уровня модуля, таких как plt.title, на методы объектов осей, например, ax.set_title.» #

Важное техническое различие в синтаксисе при смене парадигмы.

«Использование sharex позволяет избавиться от дублирования подписей делений на промежуточных осях, что делает итоговый график гораздо чище и понятнее.» #

Совет по эстетике и чистоте данных в визуализации.

«Сохранение фигур через метод savefig на объектах fig позволяет автоматизировать генерацию отчетов в фоновом режиме, исключая необходимость ручного просмотра графиков.» #

Применение навыка для автоматизации Data Science пайплайнов.

Читать далее

Мастерство управления Python-проектами: ускоряем рабочий процесс с помощью UV

Corey Schafer

Мастерство управления Python-проектами: ускоряем рабочий процесс с помощью UV

Corey Schafer

Понравился экстракт?
Подписывайтесь — лучшие материалы каждую неделю.
Telegram Дайджест →

Поделитесь с коллегами

Telegram ВКонтакте X / Twitter
Открыть в Telegram

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник