Лабораторная работа №4: Основы визуализации с Matplotlib
Цель: Перейти от построения графиков "в одну строку" к профессиональному объектно-ориентированному подходу (OOP). Мы научимся управлять объектами Figure и Axes, строить базовые графики для анализа данных и компоновать их на одной подложке.
Инструменты:
- Python 3
- Matplotlib (pyplot)
- Pandas (для подготовки данных)
- Scikit-learn (для загрузки датасета Iris)
Часть 1: Линейный график и Анатомия (OOP Style)
Мы моделируем данные с температурных датчиков сервера.
Важно
Используйте методы объекта ax, а не plt. Это ключевое отличие объектно-ориентированного подхода.
Задача:
- Создать массив
time(часы от 0 до 24). - Создать два массива температур:
temp_server_aиtemp_server_b(сгенерированы случайно, но с трендом). - Построить график, используя
plt.subplots(). - Добавить: Заголовок, Подписи осей, Легенду, Сетку.
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).
Задача:
- Загрузить датасет.
- Построить Scatter plot: по оси X —
sepal length, по оси Y —sepal width. - Раскрасить точки в зависимости от вида цветка (
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-х графиков на одной картинке.
Задача:
- Создать сетку 2x2 (
nrows=2, ncols=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(). Это предотвратит наложение элементов друг на друга.