# объектный: явная ссылка на оси
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('...')
fig.savefig('plot.png')
Правило:pyplot — быстрый стиль для интерактива; объектный API
(fig, ax) — полный контроль: несколько осей, подписи, сохранение. Для задач модуля предпочтителен объектный.
А что будет, если после fig, ax = plt.subplots() вызвать plt.xlabel(...)?
Figure — холст, Axes — подграфик: одна фигура, много осей
Figure — «холст» целиком: весь рисунок, может содержать несколько осей.
Axes — один подграфик со своими осями, подписями, линиями.
Каждый Axes настраивается независимо: title, xlabel, ylabel, legend, grid.
Источник: titanic.csv, 40 пассажиров. Линия с маркерами
скачет без выраженного тренда; пики ~230–250 у пассажиров №3, №30, №38. Одна серия — легенда не нужна.
Каким типом графика вы бы показали связь возраста и цены билета?
Источник: titanic.csv, 40 пассажиров (38 с известным возрастом;
2 пропуска отброшены автоматически). Облако широкое, без выраженного наклона — связь слабая.
Какая закономерность видна? Почему нельзя утверждать «цена растёт с возрастом»?
Источник: titanic.csv, 38 пассажиров с известным возрастом
(.dropna()); 12 корзин, интервалы 9.3–49.2. Мода — интервал 32.6–35.9 (7), вторичные
пики 16–19 и 22.6–25.9 (по 6).
Сколько пассажиров младше ~20 лет? Как это понять из гистограммы?
boxplot — медиана, квартили, выбросы
import seaborn as sns
fig, ax = plt.subplots()
sns.boxplot(data=df, x='Sex', y='Age', ax=ax)
ax.set_xlabel('пол')
ax.set_ylabel('возраст, лет')
ax.set_title('Возраст по полу')
Источник: titanic.csv, Age без пропусков.
Мужчины (n=24): медиана 25.8; женщины (n=14): медиана 32.4. Разброс сопоставим, «усатых» выбросов почти нет.
Чем boxplot лучше hist для сравнения возраста по полу?
Какой график под какой вопрос
Вопрос к данным
Тип графика
Ось X / Ось Y (с единицами)
Как меняется величина по порядку/времени?
plot
порядок/время · значение
Связаны ли две количественные величины?
scatter
x · y
Сравнить категории
bar (ось Y с нуля!)
категория · значение
Как распределена одна величина?
hist
интервалы · число наблюдений
Распределение по группам, выбросы
boxplot
группа · значение
Шпаргалка на весь семестр: выбор типа графика — половина честной визуализации.
Цена билета по классу каюты — какой тип и почему не scatter?
Live-coding 1: scatter «возраст × цена» с подписями
Задача: построить scatter возраста и цены билета на titanic.csv
объектным API: fig, ax = plt.subplots() → ax.scatter(...) → подписи с
единицами → ax.grid(alpha=0.3) → fig.savefig('figures/scatter_age_fare.png', dpi=150)
→ показать график. Комментируйте вслух каждое решение.
Что вернёт plt.subplots()? Зачем .dropna()? Какой единицы нет на оси Y?
Правило: сетка создаётся одним вызовом; каждая ось настраивается независимо
по индексу axes[i, j]. axes — это numpy-массив, индексация как в модуле 1;
на сетке 2×2 запись axes[1] — ошибка.
Какой график вы разместите в axes[1, 0], если нужно показать связь возраста и цены билета?
Файл figures/dashboard.png (dpi=110): (0,0) гистограмма возраста ·
(0,1) bar долей выживших · (1,0) scatter возраст × цена · (1,1) boxplot по полу. Каждый подграфик
подписан; общий заголовок fig.suptitle, fig.tight_layout() до savefig.
Правила: порядок всегда — настроили → сохранили → показали. dpi=150 — качество;
bbox_inches='tight' — без полей; PDF — векторный, для отчётов.
А что будет, если вызвать savefig ПОСЛЕ show?
savefig после show → пустой файл
fig, ax = plt.subplots()
ax.plot(df.index, df['Fare'])
plt.show()
fig.savefig('fare.png') # ПОСЛЕ show!# результат: пустой/белый файл — figure уже закрыта
Разбор:plt.show() в интерактивном бэкенде завершает жизненный цикл фигуры;
savefig после этого записывает пустой холст. Это «тихая» ошибка — проверяем результат, а не код:
from pathlib import Path
Path('figures/fare.png').stat().st_size # 0 или несколько байт — пустой файл
Как проверить, что файл сохранился, не открывая его глазами?
df[['Age','Fare','Pclass','Survived']].corr(); annot=True,
fmt='.2f'. Ключевые: Fare–Survived −0.22, Age–Fare −0.22; диагональ 1.00. df.corr()
«съедает» нечисловые колонки — Name и Sex не попали.
Почему в df.corr() не попали колонки Name и Sex? Что с ними сделать, чтобы учесть?
Какие корреляции реально есть: Fare–Survived r ≈ −0.22
Самые сильные по модулю: Fare–Survived (r ≈ −0.22), Age–Fare (r ≈ −0.22), остальные ещё слабее (|r| < 0.15).
Вывод: в этих данных нет признака, сильно предсказывающего выживание.
Корреляция ≠ причинность: даже значимая связь Fare и Survived могла бы объясняться третьим фактором (класс каюты).
Правильная формулировка: «связаны», а не «влияет». Знак «−» значит обратную связь, а не «плохую».
Можно ли по этой матрице утверждать «цена билета влияет на выживание»?
sns.pairplot(df[['Age','Fare','Pclass','Survived']].dropna(),
hue='Survived', diag_kind='hist'). Сетка 4×4: вне диагонали — попарные scatter, на диагонали —
гистограммы; видно, какой признак лучше разделяет классы. .dropna() обязателен.
Какой вопрос к данным можно быстро ответить, глядя на pairplot с hue='Survived'?
Типичные ошибки недели 7
Неподписанные графики — нет title/xlabel/ylabel. График без подписей не считается сданным.
savefig после show — пустой/белый файл.
Смешение стилей — plt.xlabel после создания axes.
Легенда без меток — label= не задан.
Обрезанная ось Y у bar — «раздутая» разница между категориями.
df.corr().plot() и heatmap без понимания, что корреляция — по числовым колонкам.
Цикл строит график в одни оси — нужны новые subplot или цвет/метка каждой серии.
Студент показал график с заголовком, но без подписей осей. Примете ли вы его как «сданный»?
Вопросы для проверки понимания
Зачем нужен объект Axes и чем ax.plot лучше plt.plot?
Как создать сетку 2×2 и подписать каждый график?
Как сохранить график в PNG высокого качества — и почему именно до show?
Почему нельзя обрезать ось Y у bar-диаграммы?
Какие колонки попадают в df.corr() и что показывает heatmap?
Ответьте письменно за 3 минуты — это мини-самооценка перед семинаром.
Проект модуля: дашборд + heatmap — блок 1
Проект модуля 3 (неделя 9): численный анализ (SciPy) + парсер логов (regex) + визуализация в одном ноутбуке.
Этап недели 7: «дашборд и heatmap» — визуальный слой проекта. Дашборд 2×2 и тепловая карта корреляций — то, что вы сегодня собрали.
Критерий приёмки из ТЗ: «каждый график подписан, ось Y честная, heatmap корреляций есть и прокомментирована».
Проект как пазл: визуализация (неделя 7) + числа (неделя 8) + текст (неделя 9) → один ноутбук.
Что из сегодняшнего войдёт в финальный ноутбук module3_project.ipynb?
Итоги: 5 навыков · семинар · ДЗ · one-minute paper
Сегодня вы научились: (1) выбирать тип графика под вопрос; (2) строить дашборд 2×2 с подписями; (3) сохранять график в правильном порядке; (4) строить heatmap и pairplot; (5) объяснять, почему bar строится с нуля.
Чек-лист перед сдачей любого графика: «заголовок · оси с единицами · легенда (если >1 серии) · масштаб».