Как вы использовали библиотеку matplotlib?

«Как вы использовали библиотеку matplotlib?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я активно использовал matplotlib для анализа данных, отладки моделей и создания отчетов. Вот типичные сценарии и примеры:

1. Быстрый анализ и отладка (используя pyplot интерфейс):

import matplotlib.pyplot as plt
import numpy as np

# Анализ распределения ошибок модели
errors = np.random.normal(0, 1, 1000)

fig, axes = plt.subplots(1, 2, figsize=(12, 4))

# Гистограмма
axes[0].hist(errors, bins=30, edgecolor='black', alpha=0.7)
axes[0].set_title('Распределение ошибок')
axes[0].set_xlabel('Ошибка')
axes[0].set_ylabel('Частота')
axes[0].axvline(x=0, color='r', linestyle='--', label='Ноль')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

# Q-Q plot для проверки нормальности
from scipy import stats
stats.probplot(errors, dist="norm", plot=axes[1])
axes[1].set_title('Q-Q Plot')
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('error_analysis.png', dpi=150, bbox_inches='tight')  # Сохранение для отчета
plt.show()

2. Визуализация временных рядов и динамики метрик:

# Мониторинг метрик обучения модели
epochs = range(1, 21)
train_loss = [1/np.log(e+1) + np.random.rand()*0.1 for e in epochs]
val_loss = [1.2/np.log(e+1) + np.random.rand()*0.1 for e in epochs]

plt.figure(figsize=(10, 5))
plt.plot(epochs, train_loss, 'b-o', label='Train Loss', linewidth=2, markersize=6)
plt.plot(epochs, val_loss, 'r--s', label='Validation Loss', linewidth=2, markersize=6)
plt.title('Кривые обучения модели', fontsize=14)
plt.xlabel('Эпоха', fontsize=12)
plt.ylabel('Loss', fontsize=12)
plt.legend(fontsize=11)
plt.grid(True, linestyle=':', alpha=0.7)
plt.fill_between(epochs, train_loss, val_loss, alpha=0.1, color='gray')
plt.xticks(epochs)

3. Создание сложных композиций графиков (subplots, GridSpec):

  • Для сравнения нескольких моделей или датасетов.
  • Совмещение scatter plot, bar chart и line plot на одной фигуре.

Ключевые практики, которым я следую:

  • Всегда задаю figsize для контроля размера.
  • Добавляю подписи (title, xlabel, ylabel) и легенду (legend) для читаемости.
  • Использую tight_layout() для автоматической корректировки отступов.
  • Для интеграции в веб-приложения или дашборды (например, Dash/Streamlit) конвертирую график в PNG или сохраняю напрямую в буфер (BytesIO).
  • В Jupyter Notebook использую %matplotlib inline для встраивания графиков.