Matplotlib: визуализация данных в Python
Основы работы с matplotlib
Как построить простой линейный график?
Библиотека matplotlib предоставляет интерфейс pyplot, имитирующий MATLAB. Основной функцией является plt.plot(). Для отображения графика используется plt.show().
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()Matplotlib python (библиотека matplotlib в python)
Этот код создаёт синусоиду на отрезке [0, 10]. Если не указать аргументы, plot() построит линию по умолчанию синего цвета.
Типичная ошибка: график не отображается в Jupyter Notebook. Для вывода встроенных графиков требуется выполнить магическую команду %matplotlib inline.
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])Как изменить цвет и стиль линии?
В plt.plot() можно передать третий аргумент - строку форматирования, например 'r--' для красной пунктирной линии.
plt.plot(x, y, 'g^') # зелёные треугольникиЦвета задаются буквами: b (синий), g (зелёный), r (красный), c (циан), m (пурпурный), y (жёлтый), k (чёрный), w (белый). Стили: '-' (сплошная), '--' (пунктир), ':' (точка-тире), '.' (точки), 'o' (маркеры).
Проблема: кириллица на осях отображается квадратами. Решение - задать поддержку шрифтов с помощью plt.rcParams['font.family'] = 'DejaVu Sans' или использовать plt.rcParams['font.sans-serif'] = ['Arial'].
Как создать несколько подграфиков (subplots)?
Функция plt.subplots() возвращает фигуру и массив осей. Например, для сетки 2×2:
fig, axs = plt.subplots(2, 2, figsize=(8, 6))
axs[0, 0].plot(x, np.cos(x))
axs[0, 1].scatter(x[:20], np.sin(x[:20]))
plt.show()Каждый элемент axs - объект Axes со своими методами .plot(), .scatter() и т.д. Параметр figsize задаёт размер фигуры в дюймах.
Как добавить заголовок, подписи осей и легенду?
Для одиночного графика используются plt.title(), plt.xlabel(), plt.ylabel(), plt.legend(). При работе с объектами Axes методы аналогичны: ax.set_title(), ax.set_xlabel().
plt.plot(x, y, label='sin(x)')
plt.title('График синуса')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()Ошибка: легенда не появляется. Причина - отсутствие параметра label в plt.plot(). Без него legend() не сработает.
Расширенные примеры работы с matplotlib
Анимация графика
Библиотека поддерживает анимацию через модуль animation. Пример анимированной синусоиды с обновлением данных.
import matplotlib.animation as animation
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x))
def update(frame):
line.set_ydata(np.sin(x + frame/10.0))
return line,
ani = animation.FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()Результат: плавно движущаяся синусоида. Обратите внимание на запятую после line, - она необходима для распаковки кортежа.
Проблема: анимация не работает в некоторых средах. Для сохранения используйте ani.save('animation.mp4', writer='ffmpeg').
Трёхмерные графики (mplot3d)
Для 3D графиков импортируется from mpl_toolkits.mplot3d import Axes3D. Пример поверхности.
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))
ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()[В окне вывода появляется трёхмерная поверхность с цветовой картой viridis.]
Совместное использование с Pandas
Matplotlib может напрямую строить графики из объектов DataFrame. Пример гистограммы.
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8]})
df.plot(kind='bar', x='A', y='B')
plt.title('Столбчатая диаграмма из Pandas')
plt.show()Метод df.plot() возвращает объект Axes, который можно дополнительно настраивать.
Настройка стилей с помощью rcParams
Глобальные параметры оформления задаются словарём plt.rcParams. Пример изменения размера шрифтов и линий.
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['font.size'] = 14
plt.plot(x, y)
plt.show()Эти настройки действуют для всех последующих графиков в сессии.
Сохранение графиков в высоком разрешении
Функция plt.savefig() позволяет сохранить фигуру в файл. Параметр dpi задаёт разрешение.
plt.plot(x, y)
plt.savefig('graph.png', dpi=300, bbox_inches='tight')Результат: файл graph.png с разрешением 300 DPI. Параметр bbox_inches='tight' обрезает лишние поля.
Кастомизация цвета и линий с помощью Colormap
Для задания цвета линии можно использовать числовые значения и colormap.
import matplotlib.cm as cm
x = np.linspace(0, 2*np.pi, 10)
colors = cm.viridis(np.linspace(0, 1, len(x)))
for i in range(len(x)-1):
plt.plot(x[i:i+2], np.sin(x[i:i+2]), color=colors[i])
plt.show()Каждый сегмент имеет свой цвет из палитры viridis.