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

Лабораторная работа №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).

Задача: Построить Гистограмму для petal length. Поэкспериментируйте с параметром bins (количество корзин).

# === ГИСТОГРАММА ===
# fig, ax = plt.subplots(figsize=(8, 5))
 
# TODO: Постройте гистограмму для 'petal length (cm)'
# Используйте 30 корзин (bins=30), цвет 'purple'
# ax.hist(...)
 
# ax.set_title('Distribution of Petal Length')
# plt.show()

Часть 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)?