Skip to content

2. Объектно-ориентированная архитектура и первая линия на холсте ​

Ментальный сдвиг: Процедурный pyplot против ООП-подхода ​

Почему линейный стиль MATLAB не подходит для промышленной разработки ​

В старых учебниках и быстрых примерах в сети часто встречается процедурный (линейный) подход к рисованию в Matplotlib. Код выглядит как последовательный вызов функций глобального модуля: matplotlib.pyplot.plot(x, y), затем matplotlib.pyplot.title("Name") и так далее.

Такой стиль полностью скопирован из старой инженерной среды MATLAB. Он основан на скрытом «глобальном состоянии» приложения. Программа неявно подразумевает, что любая вызванная функция настройки применяется к какому-то «текущему активному» графику.

В промышленной бэкенд-разработке и при создании сложных ИИ-пайплайнов этот подход категорически неприемлем:

  1. Потеря контроля: Если ваша фоновая задача (например, Celery-воркер) параллельно генерирует несколько разных графиков (Кривую ошибок нейросети и распределение признаков датасета), глобальный процедурный интерфейс перепутает их данные, накладывая линии одного графика на оси другого.
  2. Невозможность кастомизации: Без явных ссылок на объекты вы не сможете гибко управлять отдельными элементами холста, передавать их в функции и настраивать сложные визуальные структуры.

Переход к объектно-ориентированному проектированию (ООП) ​

Индустриальным стандартом является ООП-подход. Мы сразу и явно конструируем холст и координатные сетки как независимые программные объекты (экземпляры классов) с помощью функции-фабрики: 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*?