В мире данных красота скрывается не в сырых числах, а в их визуальном представлении. Matplotlib — это волшебная кисть для Python-разработчика, превращающая скучные массивы в захватывающие истории. Эта библиотека, основанная ещё в 2003 году, стала стандартом де-факто для научной графики, и сегодня мы не просто рассмотрим её возможности, а погрузимся в практику, создавая осмысленные визуализации шаг за шагом.
Почему именно Matplotlib?
В отличие от многих современных инструментов, Matplotlib предлагает невероятную гибкость. Вы можете контролировать каждый пиксель на графике — от толщины линии сетки до положения легенды. Это как профессиональный фоторедактор для данных: сначала кажется сложным, но, освоив его, вы получаете безграничную мощь.
Важно: Matplotlib работает по принципу «фигура» (Figure) и «оси» (Axes). Фигура — это холст, а оси — отдельный график на этом холсте. Понимание этой иерархии — ключ к созданию сложных композиций.
От простого к сложному: Практические примеры
Давайте перейдём от теории к коду. Убедитесь, что у вас установлены библиотеки: pip install matplotlib numpy pandas.
1. Линейный график: Тренды и динамика
Классика, с которой всё начинается. Идеален для отображения изменений во времени.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100) # 100 точек от 0 до 10
y = np.sin(x) # Значения синуса
plt.figure(figsize=(10, 5))
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('График функции sin(x)', fontsize=14)
plt.xlabel('Ось X', fontsize=12)
plt.ylabel('Ось Y', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.show()
Это основа. Но уже здесь можно экспериментировать: изменить цвет (color='crimson'), стиль линии (linestyle=':') или добавить маркеры (marker='o').
2. Столбчатая диаграмма: Сравнение категорий
Когда нужно наглядно сравнить количественные значения по разным группам.
categories = ['Python', 'JavaScript', 'Java', 'C++', 'Go']
popularity = [85, 78, 65, 50, 45]
fig, ax = plt.subplots(figsize=(9, 6))
bars = ax.bar(categories, popularity, color=['#2E86AB', '#A23B72', '#F18F01', '#C73E1D', '#6B8F71'])
ax.set_title('Популярность языков программирования (2024)', pad=20)
ax.set_ylabel('Уровень популярности')
# Добавим значения поверх столбцов
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 1,
f'{height}', ha='center', va='bottom')
plt.tight_layout()
plt.show()
3. Точечная диаграмма (Scatter Plot): Поиск взаимосвязей
Король анализа корреляций. Каждая точка — это наблюдение с двумя координатами.
np.random.seed(42)
n = 150
x = np.random.randn(n) * 10
y = 0.7 * x + np.random.randn(n) * 3 # Линейная зависимость с шумом
sizes = np.random.uniform(20, 200, n) # Разные размеры точек
colors = np.random.rand(n) # Разные цвета
plt.figure(figsize=(10, 7))
scatter = plt.scatter(x, y, s=sizes, c=colors, alpha=0.6, cmap='viridis')
plt.colorbar(scatter, label='Интенсивность')
plt.xlabel('Признак X')
plt.ylabel('Признак Y')
plt.title('Точечная диаграмма с дополнительными измерениями (размер и цвет)')
plt.grid(True, alpha=0.3)
plt.show()
Профессиональный совет: Используйте параметры alpha (прозрачность) и cmap (цветовая карта) для визуализации плотности точек и избегания наложения.
4. Круговые диаграммы и Subplots
Круговые диаграммы хороши для долей, но ими не стоит злоупотреблять. А subplots позволяют создавать информационные панели.
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Четыре в одном: Демонстрация subplots', fontsize=16)
# График 1: Линейный
axes[0, 0].plot([0, 1, 2, 3], [1, 4, 2, 5], marker='s')
axes[0, 0].set_title('Линейный график')
# График 2: Столбчатый
axes[0, 1].bar(['A', 'B', 'C'], [3, 7, 2], color='orange')
axes[0, 1].set_title('Столбчатая диаграмма')
# График 3: Точечный
axes[1, 0].scatter(np.random.rand(30), np.random.rand(30), c='green')
axes[1, 0].set_title('Scatter plot')
# График 4: Круговая диаграмма
data = [35, 25, 20, 20]
labels = ['Python', 'JS', 'Другие', 'Java']
axes[1, 1].pie(data, labels=labels, autopct='%1.1f%%', explode=(0.1, 0, 0, 0))
axes[1, 1].set_title('Круговая диаграмма')
plt.tight_layout()
plt.show()
5. 3D-визуализация: Выход в новое измерение
Matplotlib умеет и трёхмерную графику, что открывает двери для визуализации сложных функций и поверхностей.
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
X = np.linspace(-5, 5, 50)
Y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2)) # Поверхность "волна"
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm', alpha=0.9)
fig.colorbar(surf, shrink=0.5, aspect=10)
ax.set_title('3D-поверхность: sin(sqrt(x² + y²))', fontsize=14)
ax.set_xlabel('Ось X')
ax.set_ylabel('Ось Y')
ax.set_zlabel('Ось Z')
plt.show()
Стили и кастомизация: Создайте свой уникальный вид
Matplotlib идёт с предустановленными стилями. Посмотреть их можно командой print(plt.style.available). Применить стиль — одной строкой: plt.style.use('seaborn-v0_8-darkgrid'). Вы можете настроить всё: шрифты, размеры, цвета фона и сетки, создавая фирменный стиль для своих отчётов.
Экспорт и интеграция
Созданные графики можно сохранять в различные форматы с высоким DPI для публикаций:
plt.savefig('my_plot.png', dpi=300, bbox_inches='tight') # PNG
plt.savefig('my_plot.pdf') # Векторный PDF
plt.savefig('my_plot.svg') # Масштабируемый SVG
Matplotlib прекрасно интегрируется с Jupyter Notebook для интерактивного анализа и с веб-фреймворками (через агрегаторы, как mpld3).
Финальная рекомендация: Не бойтесь заглядывать в официальную галерею примеров Matplotlib. Это лучший способ найти вдохновение и готовый код для практически любой мыслимой визуализации.
FAQ: Часто задаваемые вопросы
Как изменить размер графика в Matplotlib?
Используйте параметр figsize при создании фигуры: plt.figure(figsize=(ширина_в_дюймах, высота_в_дюймах)).
Чем отличается plot от scatter?
plot соединяет точки линиями и идеален для последовательностей и функций. scatter рисует отдельные точки и используется для отображения распределения и корреляций двух наборов данных.
Как добавить русские подписи на график?
Нужно загрузить русскоязычный шрифт. Часто используют следующий подход:
import matplotlib
matplotlib.font_manager.fontManager.addfont('путь/к/шрифту.ttf')
font_name = matplotlib.font_manager.FontProperties(fname='путь/к/шрифту.ttf').get_name()
matplotlib.rcParams['font.family'] = font_name
Можно ли создавать интерактивные графики в Matplotlib?
Да, с помощью модуля mpld3 или бэкенда %matplotlib notebook в Jupyter. Однако для сложной интерактивности лучше рассмотреть библиотеки на его основе, как Plotly или Bokeh.
Как строить графики из данных Pandas DataFrame?
Очень просто! DataFrame имеет встроенные методы .plot(), которые используют Matplotlib под капотом. Например: df['column_name'].plot(kind='bar').