Skip to content

4. Стилизация линий, дебаг и подписи для людей ​

Добавление контекста к сырым осям ​

Снабжение графика текстовыми метаданными ​

График без подписей осей и заголовка — это просто набор абстрактных цветных линий, который не несет никакой пользы. В ИИ-инженерии критически важно снабжать графики контекстом, чтобы по сохраненному файлу отчета любой исследователь мог мгновенно понять, какие метрики, в каких единицах измерения и для какого эксперимента отображены.

Для управления текстовыми узлами дерева холста используются следующие методы объекта координатной сетки (Axes):

  • ax.set_title(text) — задает главный заголовок текущего графика.
  • ax.set_xlabel(text) — добавляет подпись к горизонтальной оси X.
  • ax.set_ylabel(text) — добавляет подпись к вертикальной оси Y.

Отрисовка легенды холста через .legend() ​

Когда на одной координатной сетке отображаются сразу несколько процессов (например, динамика ошибки на обучающей и валидационной выборках), их необходимо визуально разделять. Для этого при вызове метода ax.plot() строкам передается обязательный строковый параметр label (название линии).

После этого вызывается метод ax.legend(), который автоматически собирает все зарегистрированные метки label и строит на холсте блок интерактивной легенды.

python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Registering custom labels for the legend component
ax.plot(, [0.9, 0.4, 0.2], label="Train Loss")
ax.plot(, [1.1, 0.6, 0.5], label="Validation Loss")

# Rendering the legend box onto the axis grid
ax.legend()

Визуальное кодирование и реперные линии ​

Кастомизация параметров цвета, штриха и маркеров ​

Для точечного дебага и выделения дискретных шагов (например, эпох или чекпоинтов) внутри метода ax.plot() настраиваются параметры визуального кодирования:

  • color — задает цвет линии (можно передавать названия "red", "blue" или HEX-коды "#FF5733").
  • linestyle — определяет тип начертания линии. Популярные форматы: "-" (сплошная), "--" (пунктир), ":" (точечная).
  • marker — добавляет графические маркеры на позиции реальных точек данных. Например: "o" (окружность), "s" (квадрат), "^" (треугольник).

Использование направляющих реперных линий ax.axvline и ax.axhline ​

В задачах глубокого обучения одной из главных проблем является переобучение (Overfitting) — ситуация, когда лосс на обучении продолжает падать, а лосс на валидации начинает стабильно расти.

Чтобы зафиксировать критическую точку переобучения на графике для отчета, используются вспомогательные сквозные реперные линии:

  • ax.axvline(x, color, linestyle) — строит строго вертикальную линию через всю координатную сетку на позиции x.
  • ax.axhline(y, color, linestyle) — строит строго горизонтальную линию на позиции y.
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Advanced styling with colors, markers, and custom linestyles
ax.plot(, [0.5, 0.7, 0.9], color="green", linestyle="--", marker="o", label="Accuracy")

# Drawing a vertical reference line to highlight a critical threshold event
ax.axvline(x=2.0, color="red", linestyle=":", label="Overfitting Start")
ax.legend()

Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию) ​

1. Добавление текстовых подписей к осям ​

Задача: Создайте холст и осей. Нарисуйте базовую линию по координатам x=, y=. Добавьте заголовок "Model Training", подпись оси X — "Epochs", подпись оси Y — "Loss Value".

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()
ax.plot(,)

# Mutating text metadata configurations node
ax.set_title("Model Training")
ax.set_xlabel("Epochs")
ax.set_ylabel("Loss Value")

2. Сборка графика с двухкомпонентной легендой ​

Задача: Нарисуйте на одной сетке две линии: первую по координатам x=, y=[0.1, 0.5] с меткой label="Layer 1", вторую — x=, y=[0.3, 0.9] с меткой label="Layer 2". Отобразите легенду на графике.

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Binding label properties to line drawing calls
ax.plot(, [0.1, 0.5], label="Layer 1")
ax.plot(, [0.3, 0.9], label="Layer 2")

# Constructing legend block layout
ax.legend()

3. Кастомизация начертания и цвета линии тренда ​

Задача: Постройте график тренда по координатам x=, y=[10, 20, 15]. Сделайте линию красного цвета ("red"), тип начертания — пунктир ("--"), а в качестве маркеров точек установите квадраты ("s").

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Applying custom colors, markers and styles attributes
ax.plot(, [10, 20, 15], color="red", linestyle="--", marker="s")
ax.grid(True)

4. Фиксация точки переобучения вертикальной реперной линией ​

Задача: Создайте график. Проведите через него вертикальную направляющую линию на позиции x=3.0 красного цвета с точечным стилем начертания (":"), добавив ей подпись label="Early Stopping". Отобразите легенду.

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Drawing an execution milestone line component
ax.axvline(x=3.0, color="red", linestyle=":", label="Early Stopping")
ax.legend()

5. Разметка целевого порога точности горизонтальной линией ​

Задача: Создайте график. Проведите через него горизонтальную направляющую линию на уровне y=0.90 (целевой порог точности модели) синего цвета ("blue") со сплошным начертанием.

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Setting horizontal reference bound line
ax.axhline(y=0.90, color="blue", linestyle="-")
ax.grid(True)

Упражнения смешанные (5 шт) (включают материал прошлых уроков) ​

6. Мониторинг Overfitting в Headless-режиме на данных Pandas DataFrame ​

Задача: Загрузите лог обучения из таблицы df_history = pandas.DataFrame({"train_loss": [1.20, 0.60, 0.35, 0.20], "val_loss": [1.35, 0.80, 0.75, 0.90], "epoch":}) (Урок 5 модуля Pandas). Настройте Matplotlib для работы без вывода графического интерфейса (Урок 3 модуля Matplotlib). Постройте совмещенный график линий "train_loss" и "val_loss" от эпохи с добавлением легенды (Урок 4 модуля Matplotlib). Проведите вертикальную реперную линию на эпохе 2, где валидационный лосс пошел вверх, обозначив её как "Overfitting Start" (Урок 4 модуля Matplotlib). Добавьте подписи осей и сохраните отчет в файл "overfitting_report.png" (Урок 3 / Урок 4 модуля Matplotlib).

Посмотреть решение
python
import matplotlib
# Activating headless state first to secure server threads (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot
import pandas

df_history = pandas.DataFrame({"train_loss": [1.20, 0.60, 0.35, 0.20], "val_loss": [1.35, 0.80, 0.75, 0.90], "epoch":})

fig, ax = matplotlib.pyplot.subplots(figsize=(8, 5))

# Plotting named series vector attributes with legend labels (Pandas Lesson 7 & Matplotlib Lesson 2, 4)
ax.plot(df_history["epoch"], df_history["train_loss"], color="blue", marker="o", label="Train Loss")
ax.plot(df_history["epoch"], df_history["val_loss"], color="orange", marker="s", label="Validation Loss")

# Inscribing text metadata and drawing reference vertical indicator (Matplotlib Lesson 4)
ax.set_title("Training Loss Convergence Analysis")
ax.set_xlabel("Training Epochs")
ax.set_ylabel("Loss Metric")

ax.axvline(x=2, color="red", linestyle="--", label="Overfitting Start")
ax.legend()
ax.grid(True)

# Export buffer straight to file blocks (Matplotlib Lesson 3)
fig.savefig("overfitting_report.png")

7. Стилизованный рендеринг тригонометрических сеток NumPy по осям ​

Задача: Сгенерируйте массив из 60 точек от 0.0 до 12.0 через numpy.linspace() (Урок 3 модуля NumPy). Вычислите векторизованный массив синусов через numpy.sin() (Урок 8 модуля NumPy). Создайте холст (Урок 2 модуля Matplotlib). Постройте график синусоиды, сделав линию зеленого цвета, пунктирной, без маркеров точек, подписав её в легенде как "Signal Wave" (Урок 4 модуля Matplotlib). Добавьте подписи осей X ("Time, s") и Y ("Amplitude, V"), а также зафиксируйте нулевой уровень сигнала горизонтальной реперной линией y=0.0 черного цвета ("black") с точечным стилем (Урок 4 модуля Matplotlib). Сохраните результат в "signal_plot.png".

Посмотреть решение
python
import numpy
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot

# Generating underlying mathematical data tensors (NumPy Lessons 3 & 8)
time_axis = numpy.linspace(0.0, 12.0, 60)
signal_amplitude = numpy.sin(time_axis)

fig, ax = matplotlib.pyplot.subplots()

# Customized line plotting (Matplotlib Lessons 2 & 4)
ax.plot(time_axis, signal_amplitude, color="green", linestyle="--", label="Signal Wave")

# Appending text annotations and baseline zero axis indicator
ax.set_title("Oscilloscope Signal Waveform")
ax.set_xlabel("Time, s")
ax.set_ylabel("Amplitude, V")

ax.axhline(y=0.0, color="black", linestyle=":", label="Zero Level")
ax.legend()
ax.grid(True)

fig.savefig("signal_plot.png")

8. График отфильтрованных по порогу метрик точности из Parquet-файла ​

Задача: Загрузите файл "validation_history.parquet" (Урок 8 модуля Pandas). С помощью булевой фильтрации через оператор .loc[] извлеките только те строки, у которых значение шага "step" строго больше 10 (Урок 6 модуля Pandas). Сделайте изолированную копию полученной таблицы через .copy() (Урок 3 модуля Pandas). Постройте график признака "accuracy" от "step" в headless-режиме (Урок 3 / Урок 13 модуля Pandas / Урок 2 модуля Matplotlib). Окрасьте линию в фиолетовый цвет ("purple"), установите маркеры треугольников ("^"), подпишите оси и проведите горизонтальный реперный уровень на высоте y=0.85, подписав линию как "Target Accuracy" (Урок 4 модуля Matplotlib). Сохраните в "accuracy_milestone.png".

Посмотреть решение
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot

# Loading tabular dataset tracking elements from disk (Pandas Lesson 8)
full_logs_df = pandas.read_parquet(path="validation_history.parquet")

# Filtering rows subset utilizing boolean constraints and deep copying (Pandas Lessons 3 & 6)
clean_subset_df = full_logs_df.loc[full_logs_df["step"] > 10, :].copy()

fig, ax = matplotlib.pyplot.subplots()

# Plotting and advanced styling metadata decoration (Pandas Lesson 13 & Matplotlib Lessons 2, 4)
ax.plot(clean_subset_df["step"], clean_subset_df["accuracy"], color="purple", linestyle="-", marker="^", label="Current Run")

ax.set_title("Model Step-wise Accuracy After Warmup")
ax.set_xlabel("Optimization Steps")
ax.set_ylabel("Accuracy Score")

ax.axhline(y=0.85, color="red", linestyle="--", label="Target Accuracy")
ax.legend()
ax.grid(True)

fig.savefig("accuracy_milestone.png")

9. Наслоение отслайсенных векторов весов C-буфера с раздельной стилизацией ​

Задача: Создайте 2D-матрицу весов из диапазона от 0 до 11 через numpy.arange(12).reshape(3, 4) (Урок 3 / Урок 11 модуля NumPy). Оберните её в pandas.DataFrame (Урок 5 модуля Pandas). Извлеките первую строку (индекс 0) в переменную layer_1_values и вторую строку (индекс 1) в layer_2_values с помощью позиционного оператора .iloc[] (Урок 6 модуля Pandas). Обратитесь к их низкоуровневым буферам .values (Урок 2 модуля Pandas). Постройте обе эти линии на одной координатной сетке в headless-режиме: первую сделайте синей сплошной с круглыми маркерами (label="Layer 1"), вторую — оранжевой пунктирной с квадратными маркерами (label="Layer 2") (Урок 4 модуля Matplotlib). Выведите легенду и сохраните картинку в файл "layers_comparison.png".

Посмотреть решение
python
import numpy
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot

# Building a multi-dimensional array dataset layout (NumPy Lessons 3 & 11)
raw_matrix = numpy.arange(12).reshape(3, 4)
dataset_df = pandas.DataFrame(raw_matrix)

# Isolating raw vector channels layers views via positional indices (Pandas Lesson 6)
layer_1_values = dataset_df.iloc[0, :]
layer_2_values = dataset_df.iloc[1, :]

fig, ax = matplotlib.pyplot.subplots()

# Overlaying multiple styled line trajectories onto a shared memory canvas node (Pandas Lesson 2 & Matplotlib Lessons 2, 4)
ax.plot(layer_1_values.values, color="blue", linestyle="-", marker="o", label="Layer 1")
ax.plot(layer_2_values.values, color="orange", linestyle="--", marker="s", label="Layer 2")

ax.set_title("Layer Weights Magnitudes Across Channels")
ax.set_xlabel("Channel Connection Index")
ax.set_ylabel("Weight Value")

ax.legend()
ax.grid(True)

fig.savefig("layers_comparison.png")

10. Поиск и вызов справки по методу легенды ax.legend в Jupyter ​

Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную Docstring-справку по встроенному методу конфигурации легенд matplotlib.axes.Axes.legend с помощью символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).

Посмотреть решение
python
import matplotlib.axes

# Running this cell query pipeline layout statement opens the API configuration instructions panel
?matplotlib.axes.Axes.legend