Matplotlib: визуализация данных в Python

Раздел: Разработка на Python -> Библиотека matplotlib

Основы работы с 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.

Библиотека matplotlib в Python - comments

En
Matplotlib python (python)