machine-learning Лабораторная работа

Лабораторная работа №4: Основы визуализации с Matplotlib

Лабораторная работа №4: Основы визуализации с Matplotlib

Цель: Перейти от построения графиков “в одну строку” к профессиональному объектно-ориентированному подходу (OOP). Мы научимся управлять объектами Figure и Axes, строить базовые графики для анализа данных и компоновать их на одной подложке.

Инструменты:

  • Python 3
  • Matplotlib (pyplot)
  • Pandas (для подготовки данных)
  • Scikit-learn (для загрузки датасета Iris)

Часть 1: Линейный график и Анатомия (OOP Style)

Мы моделируем данные с температурных датчиков сервера.

Важно

Используйте методы объекта ax, а не plt. Это ключевое отличие объектно-ориентированного подхода.

Задача:

  1. Создать массив time (часы от 0 до 24).
  2. Создать два массива температур: temp_server_a и temp_server_b (сгенерированы случайно, но с трендом).
  3. Построить график, используя plt.subplots().
  4. Добавить: Заголовок, Подписи осей, Легенду, Сетку.
import matplotlib.pyplot as plt
import numpy as np

# Генерация данных
np.random.seed(42)
time = np.linspace(0, 24, 100)
temp_server_a = 50 + 20 * np.sin(time / 4) + np.random.normal(0, 2, 100)
temp_server_b = 60 + 15 * np.cos(time / 4) + np.random.normal(0, 2, 100)

# TODO: 1. Создайте Figure и Axes (размер 10x6 дюймов)
# fig, ax = ...

# TODO: 2. Постройте две линии на одном ax
# server_a (цвет blue, label='Server A')
# server_b (цвет red, стиль линии '--', label='Server B')
# ax.plot(...)
# ax.plot(...)

# TODO: 3. Настройте "обвес" графика
# Заголовок: "Daily Temperature Monitoring"
# Ось X: "Time (h)"
# Ось Y: "Temperature (C)"
# ax.set_...

# TODO: 4. Включите легенду и сетку
# ax.legend()
# ax.grid(True)

plt.show()

Часть 2: Scatter Plot (Поиск зависимостей)

Используем классический датасет Iris. Посмотрим, есть ли связь между длиной и шириной чашелистика (sepal).

Задача:

  1. Загрузить датасет.
  2. Построить Scatter plot: по оси X — sepal length, по оси Y — sepal width.
  3. Раскрасить точки в зависимости от вида цветка (c=target).
from sklearn.datasets import load_iris
import pandas as pd

# Загрузка данных
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target

print(df.head())

# TODO: Создайте Figure и Axes
# fig, ax = ...

# TODO: Постройте scatter plot
# x = df['sepal length (cm)']
# y = df['sepal width (cm)']
# c = df['target'] (цвет зависит от класса)
# scatter = ax.scatter(..., ..., c=..., cmap='viridis', alpha=0.7)

# Настройка
# ax.set_xlabel('Sepal Length')
# ax.set_ylabel('Sepal Width')
# ax.set_title('Iris Dataset: Sepal Dimensions')

# Добавляем цветовую шкалу (colorbar)
# fig.colorbar(scatter, ax=ax, label='Species')

plt.show()

Часть 3: Гистограмма и Boxplot (Распределения)

Анализируем, как распределена длина лепестка (petal length).


Часть 4: Subplots (Компоновка)

Высший пилотаж — собрать дашборд из 4-х графиков на одной картинке.

Задача:

  1. Создать сетку 2x2 (nrows=2, ncols=2).
  2. Разместить графики в ячейках:
    • [0, 0]: Line Plot (Температуры из части 1).
    • [0, 1]: Scatter Plot (Iris из части 2).
    • [1, 0]: Histogram (Petal Length).
    • [1, 1]: Пустой (или любой другой эксперимент).
# TODO: Создайте сетку 2 на 2, общий размер (12, 10)
# fig, axs = plt.subplots(2, 2, figsize=(12, 10))

# Доступ к ячейкам идет по индексам: axs[строка, столбец]

# 1. Линейный график (верхний левый)
# axs[0, 0].plot(time, temp_server_a, label='Server A')
# axs[0, 0].set_title('Line Plot')

# 2. Scatter (верхний правый)
# axs[0, 1].scatter(df['sepal length (cm)'], df['sepal width (cm)'], c=df['target'])
# axs[0, 1].set_title('Scatter Plot')

# 3. Histogram (нижний левый)
# axs[1, 0].hist(df['petal length (cm)'], bins=20, color='green')
# axs[1, 0].set_title('Histogram')

# 4. Boxplot (нижний правый) - для разнообразия только одну колонку
# axs[1, 1].boxplot(df['petal width (cm)'])
# axs[1, 1].set_title('Boxplot (Petal Width)')

# Магия: автоматическое выравнивание отступов
plt.tight_layout()
plt.show()

Секрет аккуратной верстки

Магия: автоматическое выравнивание отступов достигается с помощью вызова plt.tight_layout() перед plt.show(). Это предотвратит наложение элементов друг на друга.


🧠 Проверка знаний

При использовании объектно-ориентированного подхода в Matplotlib, для чего нужен объект Axes?

Какой метод позволяет избежать перекрытия графиков при создании сетки (Subplots)?