В мире данных картинка стоит тысячи таблиц. Matplotlib — это волшебная кисть для Python-разработчика, превращающая сухие цифры в живые, понятные истории. Освоив эту библиотеку, вы не просто строите графики — вы создаёте визуальные нарративы, которые убеждают, объясняют и вдохновляют.
Почему именно Matplotlib?
Хотя сегодня существует множество инструментов визуализации, Matplotlib остаётся фундаментом экосистемы Python для науки о данных. Это библиотека с богатейшей историей, невероятной гибкостью и полным контролем над каждым пикселем вашего графика. Она идеально подходит как для быстрого анализа, так и для подготовки публикационных материалов.
Matplotlib был создан Джоном Хантером в 2002 году как альтернатива проприетарному MATLAB. Сегодня это стандарт де-факто для научной визуализации в Python.
От простого к сложному: Практические примеры
1. Линейный график — классика жанра
Начнём с основ — построения простого графика функции. Всего несколько строк кода открывают мир возможностей:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('График синусоиды')
plt.xlabel('Ось X')
plt.ylabel('Ось Y')
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()
2. Столбчатые диаграммы для сравнения
Когда нужно сравнить категориальные данные, столбчатые диаграммы становятся незаменимыми:
categories = ['Python', 'JavaScript', 'Java', 'C++', 'Go']
values = [35, 28, 20, 12, 5]
plt.figure(figsize=(10, 6))
bars = plt.bar(categories, values, color=['#306998', '#f7df1e', '#b07219', '#004482', '#00add8'])
plt.title('Популярность языков программирования в 2024')
plt.ylabel('Доля рынка (%)')
# Добавляем значения над столбцами
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 0.5,
f'{height}%', ha='center', va='bottom')
plt.tight_layout()
plt.show()
3. Круговые диаграммы для пропорций
Идеальный выбор для отображения долей целого:
labels = ['Аренда', 'Еда', 'Транспорт', 'Развлечения', 'Накопления']
sizes = [40, 25, 15, 10, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0']
explode = (0.1, 0, 0, 0, 0) # Выделяем первый сегмент
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=90)
plt.title('Структура семейного бюджета')
plt.axis('equal') # Круглая, а не эллиптическая диаграмма
plt.show()
4. Рассеяние для выявления корреляций
Диаграмма рассеяния помогает увидеть взаимосвязь между двумя переменными:
np.random.seed(42)
x = np.random.randn(100) * 10 + 50
y = x * 0.8 + np.random.randn(100) * 5 + 10
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.6, c='green', edgecolors='black', s=100)
plt.title('Зависимость времени обучения от количества практики')
plt.xlabel('Часы практики в неделю')
plt.ylabel('Средний балл')
plt.grid(True, alpha=0.3)
# Добавляем линию тренда
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x), "r--", alpha=0.8, label='Линия тренда')
plt.legend()
plt.show()
5. Гистограммы для распределений
Когда нужно понять распределение данных, гистограммы показывают частоту значений:
data = np.random.normal(170, 10, 1000) # Рост людей
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, edgecolor='black', alpha=0.7, color='purple')
plt.title('Распределение роста в выборке')
plt.xlabel('Рост (см)')
plt.ylabel('Частота')
plt.axvline(data.mean(), color='red', linestyle='dashed', linewidth=2,
label=f'Среднее: {data.mean():.1f} см')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Продвинутые техники
Множественные графики (subplots)
Создаём информативную панель из нескольких графиков:
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Сравнительный анализ данных', fontsize=16)
# График 1
axes[0, 0].plot(np.random.randn(50).cumsum())
axes[0, 0].set_title('Кумулятивная сумма')
# График 2
axes[0, 1].scatter(np.random.randn(100), np.random.randn(100))
axes[0, 1].set_title('Случайное рассеяние')
# График 3
axes[1, 0].bar(['A', 'B', 'C', 'D'], np.random.randint(1, 10, 4))
axes[1, 0].set_title('Столбчатая диаграмма')
# График 4
axes[1, 1].hist(np.random.randn(1000), bins=30)
axes[1, 1].set_title('Гистограмма')
plt.tight_layout()
plt.show()
Используйте plt.tight_layout() для автоматического выравнивания графиков и предотвращения наложений подписей.
Тепловые карты (heatmaps)
Отличный способ визуализации матричных данных:
import seaborn as sns # Для красивого отображения
matrix = np.random.rand(10, 10)
plt.figure(figsize=(10, 8))
sns.heatmap(matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Тепловая карта корреляций')
plt.show()
Стилизация и кастомизация
Matplotlib предлагает множество стилей оформления. Посмотреть доступные стили можно командой:
print(plt.style.available)
Применить стиль просто:
plt.style.use('seaborn-v0_8-darkgrid')
FAQ: Часто задаваемые вопросы
Как сохранить график в файл?
Используйте метод savefig() перед show():
plt.savefig('график.png', dpi=300, bbox_inches='tight')
Почему график не отображается в Jupyter Notebook?
Добавьте магическую команду в первую ячейку:
%matplotlib inline
Как изменить размер шрифта на графике?
Используйте параметр fontsize в функциях title(), xlabel(), ylabel() или установите глобально:
plt.rcParams.update({'font.size': 12})
Чем отличается plot() от scatter()?
plot() соединяет точки линиями (для последовательных данных), scatter() рисует отдельные точки (для несвязанных данных).
Как добавить легенду?
Укажите label в функции построения и вызовите legend():
plt.plot(x, y, label='Моя линия')
plt.legend()
Какие есть альтернативы Matplotlib?
Plotly (интерактивные графики), Seaborn (статистическая визуализация), Bokeh (веб-визуализация), Altair (декларативный подход).
Matplotlib — это не просто инструмент, а целый язык визуализации. Начните с простых примеров, экспериментируйте с параметрами, и вскоре вы сможете создавать профессиональные визуализации, которые расскажут вашу историю данных лучше любых слов.