Appearance
2. Объектно-ориентированная архитектура и первая линия на холсте
Ментальный сдвиг: Процедурный pyplot против ООП-подхода
Почему линейный стиль MATLAB не подходит для промышленной разработки
В старых учебниках и быстрых примерах в сети часто встречается процедурный (линейный) подход к рисованию в Matplotlib. Код выглядит как последовательный вызов функций глобального модуля: matplotlib.pyplot.plot(x, y), затем matplotlib.pyplot.title("Name") и так далее.
Такой стиль полностью скопирован из старой инженерной среды MATLAB. Он основан на скрытом «глобальном состоянии» приложения. Программа неявно подразумевает, что любая вызванная функция настройки применяется к какому-то «текущему активному» графику.
В промышленной бэкенд-разработке и при создании сложных ИИ-пайплайнов этот подход категорически неприемлем:
- Потеря контроля: Если ваша фоновая задача (например, Celery-воркер) параллельно генерирует несколько разных графиков (Кривую ошибок нейросети и распределение признаков датасета), глобальный процедурный интерфейс перепутает их данные, накладывая линии одного графика на оси другого.
- Невозможность кастомизации: Без явных ссылок на объекты вы не сможете гибко управлять отдельными элементами холста, передавать их в функции и настраивать сложные визуальные структуры.
Переход к объектно-ориентированному проектированию (ООП)
Индустриальным стандартом является ООП-подход. Мы сразу и явно конструируем холст и координатные сетки как независимые программные объекты (экземпляры классов) с помощью функции-фабрики: fig, ax = matplotlib.pyplot.subplots()
Конструкция возвращает кортеж из двух объектов, которые мы распаковываем в две переменные:
fig(экземпляр классаFigure) — объект самого физического полотна (холста). Он отвечает за общие параметры картинки: её размер, сохранение в файл на диск и фоновый цвет.ax(экземпляр классаAxes) — объект конкретной координатной сетки (зоны отрисовки). Именно у этого объекта мы вызываем методы добавления линий, настройки осей, сеток и текстовых подписей.
График как JSON-дерево или HTML-DOM
Иерархия объектов холста
Чтобы бэкендеру было легко освоить Matplotlib, достаточно представить структуру графика в виде знакомого иерархического дерева (аналог HTML DOM-дерева в веб-разработке или древовидной структуры вложенного JSON-документа).
Каждый элемент на графике — это дочерний узел (компонент) внутри родительского контейнера:
Figure(Корень дерева)Axes(Дочерний узел первого уровня)Line2D(Линии тренда — дочерний узел)Text(Заголовки и подписи — дочерний узел)XAxis / YAxis(Координатные оси с делениями и сеткой)
Отрисовка базовой непрерывной линии через ax.plot()
Для добавления линейного графика (например, изменения функции потерь или потребления памяти) используется метод координатной сетки ax.plot(x, y). Он принимает на вход две одномерные последовательности (векторы x и y) одинаковой длины и связывает точки непрерывной векторной линией тренда.
Управлять физическим размером полотна можно при создании холста, передав кортеж размеров в дюймах в параметр figsize=(width, height). Включение сетки выполняется вызовом метода дочернего контейнера ax.grid(True).
python
import matplotlib.pyplot
# Step 1: Instantiating explicit objects using the OOP factory pattern
# figsize sets canvas width and height metrics in inches
fig, ax = matplotlib.pyplot.subplots(figsize=(8, 4))
# Step 2: Defining coordinate metrics sequences data
time_steps = [1, 2, 3, 4]
memory_usage = [15.2, 22.4, 18.1, 35.6]
# Step 3: Mutating the coordinate object by appending a line element
ax.plot(time_steps, memory_usage)
# Step 4: Enabling coordinate grid background lines
ax.grid(True)Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Явное конструирование холста и осей
Задача: Напишите код, который с помощью фабричной ООП-функции matplotlib.pyplot.subplots() одновременно создает объекты холста и координатной сетки. Выведите типы полученных переменных в консоль с помощью функции type().
Посмотреть решение
python
import matplotlib.pyplot
# Unpacking explicit OOP container references
fig, ax = matplotlib.pyplot.subplots()
print("Canvas container class type:", type(fig)) # <class 'matplotlib.figure.Figure'>
print("Coordinate zone class type:", type(ax)) # <class 'matplotlib.axes._axes.Axes'>2. Настройка физической геометрии холста
Задача: Создайте холст и координатную сетку, принудительно задав физический размер полотна равным 12 дюймам по ширине и 6 дюймам по высоте с помощью параметра figsize.
Посмотреть решение
python
import matplotlib.pyplot
# Defining custom shape metrics specifications during layout initialization
fig, ax = matplotlib.pyplot.subplots(figsize=(12, 6))3. Отрисовка базового графика тренда
Задача: Даны две последовательности: x_epochs = [1, 2, 3] и y_accuracy = [0.55, 0.72, 0.88]. Создайте объекты холста и осей, добавьте на координатную сетку линию этого тренда с помощью метода .plot() и включите отображение сетки.
Посмотреть решение
python
import matplotlib.pyplot
x_epochs = [1, 2, 3]
y_accuracy = [0.55, 0.72, 0.88]
# Standard OOP plotting pipeline execution
fig, ax = matplotlib.pyplot.subplots()
ax.plot(x_epochs, y_accuracy)
ax.grid(True)4. Добавление нескольких линий на одну сетку坐标
Задача: Вы можете вызывать метод .plot() несколько раз подряд на одном и том же объекте ax, чтобы наслоить несколько линий на одну координатную сетку. Нарисуйте на одной сетке две линии: первую по координатам x=[1, 2], y=[10, 20], вторую — x=[1, 2], y=[15, 12].
Посмотреть решение
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Appending multiple independent line components into the same coordinate buffer node
ax.plot([1, 2], [10, 20])
ax.plot([1, 2], [15, 12])
ax.grid(True)5. Подавление лишнего текстового вывода в Jupyter
Задача: В Jupyter Notebook вызов метода ax.plot() часто выводит над графиком служебный текст вроде [<matplotlib.lines.Line2D at ...>]. Чтобы подавить этот лишний бэкенд-текст, в самом конце ячейки принято ставить точку с запятой ;. Напишите пример вызова метода .plot() с точкой с запятой на конце.
Посмотреть решение
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Trailing semicolon suppresses non-graphical notebook console printouts
ax.plot([0, 1], [0, 1])Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Отрисовка плотной тригонометрической сетки на базе массивов NumPy
Задача: Сгенерируйте линейную плотную шкалу координат из 50 точек в диапазоне от 0.0 до 10.0 с помощью numpy.linspace() (Урок 3 модуля NumPy). Вычислите для полученного массива векторизованный вектор косинусов с помощью ufunc-функции numpy.cos() (Урок 8 модуля NumPy). Создайте холст Matplotlib размером (10, 5) и постройте непрерывный график полученной волны, вызвав метод .plot() (Урок 2 модуля Matplotlib).
Посмотреть решение
python
import numpy
import matplotlib.pyplot
# Step 1: Generate tight feature space array (NumPy Lesson 3)
x_coordinates = numpy.linspace(0.0, 10.0, 50)
# Step 2: Running vectorized math_oge transformation ufunc (NumPy Lesson 8)
y_cos_values = numpy.cos(x_coordinates)
# Step 3: Explicit OOP layout canvas plotting (Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots(figsize=(10, 5))
ax.plot(x_coordinates, y_cos_values)
ax.grid(True)7. Визуализация тренда функции потерь напрямую из столбцов таблицы Pandas
Задача: Создайте DataFrame логов обучения history_df = pandas.DataFrame({"loss": [1.45, 0.82, 0.41, 0.15], "epoch":}) (Урок 5 модуля Pandas). Сделайте ООП-инициализацию холста и координатной сетки (Урок 2 модуля Matplotlib). Передайте столбцы таблицы напрямую в качестве аргументов осей x и y метода .plot(), обратившись к ним по именам ключей (Урок 7 модуля Pandas). Включите фоновую сетку.
Посмотреть решение
python
import pandas
import matplotlib.pyplot
# Instantiating dataframe matrix tracking workspace (Pandas Lesson 5)
history_df = pandas.DataFrame({"loss": [1.45, 0.82, 0.41, 0.15], "epoch":})
# Plotting directly using named series vectors tokens (Pandas Lesson 7 & Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots()
ax.plot(history_df["epoch"], history_df["loss"])
ax.grid(True)8. График отсортированных метрик точности с очисткой дубликатов строк
Задача: Дан зашумленный DataFrame оценок качества: df_raw = pandas.DataFrame({"accuracy": [0.55, 0.88, 0.55], "step": [10, 20, 10]}) (Урок 5 модуля Pandas). Удалите идентичные строки-дубликаты на месте (Урок 9 модуля Pandas). Отсортируйте оставшиеся данные по значениям шагов "step" по возрастанию на месте (Урок 4 модуля Pandas). Выгрузите очищенные столбцы "step" и "accuracy" в метод ax.plot() для построения графика тренда (Урок 2 модуля Matplotlib).
Посмотреть решение
python
import pandas
import matplotlib.pyplot
df_raw = pandas.DataFrame({"accuracy": [0.55, 0.88, 0.55], "step": [10, 20, 10]})
# Step 1: Remove twin row duplicates (Pandas Lesson 9)
df_raw.drop_duplicates(inplace=True)
# Step 2: Sort dataframe tracking sequence via step index (Pandas Lesson 4)
df_raw.sort_values(by="step", inplace=True)
# Step 3: Stream parameters directly into OOP plotting node (Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots()
ax.plot(df_raw["step"], df_raw["accuracy"])
ax.grid(True)9. Построение графика по отслайсенному представлению унаследованной памяти C-буфера
Задача: Сгенерируйте большой массив из 100 нулей типа numpy.float32 через numpy.zeros (Урок 4 модуля NumPy). Переведите его в одномерную структуру pandas.Series (Урок 2 модуля Pandas). Выделите позиционный срез первых 10 элементов в переменную sub_view (Урок 3 модуля Pandas). Чтобы симулировать сигнал, прибавьте к элементам sub_view in-place значение 5.5 через оператор += (Урок 8 модуля NumPy). Обратитесь к низкоуровневому C-буферу родительского контейнера через .values (Урок 2 модуля Pandas) и постройте график всего итогового вектора с помощью метода ax.plot() (Урок 2 модуля Matplotlib).
Посмотреть решение
python
import numpy
import pandas
import matplotlib.pyplot
# Step 1: Allocate quantized pandas layer space (NumPy Lesson 4 & Pandas Lesson 2)
root_series = pandas.Series(data=numpy.zeros(100, dtype=numpy.float32))
# Step 2: Extract positional slice view reference (Pandas Lesson 3)
sub_view = root_series[:10]
# Step 3: Run memory-efficient in-place mutations (NumPy Lesson 8)
sub_view += 5.5
# Step 4: Access raw internal vector array buffer and plot (Pandas Lesson 2 & Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots()
ax.plot(root_series.values)
ax.grid(True)10. Поиск методов геометрических трансформаций холста в Jupyter по маске названий
Задача: Напишите поисковый запрос по шаблону для выполнения в среде Jupyter Notebook, который отфильтрует и выведет список всех доступных в подмодуле matplotlib.pyplot функций, начинающихся на префикс sub (например, конструкторы мультипанельных сеток и окон) (Урок 1 модуля NumPy / Урок 1 модуля Pandas).
Посмотреть решение
python
import matplotlib.pyplot
# Running this masked query block statement in a Jupyter notebook cell expands the methods dropdown
matplotlib.pyplot.sub*?