Графики

Самым популярным модулем для построения графиков в Python является matplotlib[pip].

Бекенды

Модуль matplotlib предоставляет стандартное API для построение графиков и, так называемые, бекенды, которые отвечают за вывод результатов пользователю.

Они бывают как интерактивные (открываются в отдельном окне, позволяют заимодействовать с графиком, например Qt5Agg), так и неинтерактивные, результатом работы которых является картинка. В средах использующих IPython (например Spyder) имеется дополнительный неинтерактивные бекенд inline, для вывода графиков в среду. Неинтерактивные бекенды удобны для создания большого числа графиков.

Выбор бекенда осуществляется в настройках среды или в коде:

import matplotlib
matplotlib.use('Qt5Agg')

Глобальный объект pyplot

Модуль matplotlib содержит глобальный объект pyplot, который выступает в роли стандартного холста:

import numpy as np
import matplotlib.pyplot as plt

# рисуем
plt.plot([1,2,3],[5,3,7])

# отображаем или сохраняем
plt.show()
plt.savefig('filename.png')

Хорошие форматы для сохранения графиков: векторные: .svg, .eps и растровые без потерь: .png, .tiff.

При запуске по ячейкам среды автоматически вызывают plt.show() если в ячейке что-то было нарисовано для отображения результата.

После отображения или сохранения результата глобальный объект pyplot очищается.

Рисование с использованием объекта plt (в стиле MATLAB)

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)

plt.plot(t, s, color="blue", label="s(t)")
plt.xlabel('время, с')
plt.ylabel('значение, мВ')
plt.title('Заголовок слайда')
plt.grid()
plt.legend()

Рисование с использованием объекта plt (в стиле matplotlib)

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)

fig = plt.figure()
ax = fig.add_subplot()
ax.plot(t, s, color="blue", label="s(t)")
ax.set_xlabel('время, с')
ax.set_ylabel('значение, мВ')
ax.set_title('Заголовок слайда')
ax.grid()
ax.legend()

Рисование с использованием объекта Figure

import matplotlib

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)

fig = matplotlib.figure.Figure()
ax = fig.add_subplot()
ax.plot(t, s, color="blue", label="s(t)")
ax.set_xlabel('время, с')
ax.set_ylabel('значение, мВ')
ax.set_title('Заголовок слайда')
ax.grid()
ax.legend()

fig.savefig('file.png')

Анатомия графика

Популярные типы графиков - основные

Метод Назначение
errorbar(x, y, yerr, xerr) Точки с усами ошибок
plot(x, y) Кривая
scatter(x, y) Точки

Некоторые аргументы plot и scatter

Аргумент Назначение Примеры значений
color Цвет линии "black", "#f000f0"
label Текст в легенде "синус икс"
linestyle Стиль линии "", "-", "--", "dotted"
linewidth Ширина линии 6.5
marker Форма маркера "", "+", "o", "4"
markerfacecolor Цвет маркера "black", "#f000f0"
markeredgecolor Цвет обводки маркера "black", "#f000f0"
markeredgewidth Ширина обводки маркера 0.5
markersize Размер маркера 2.5

Теплокарты и контуры

Метод Назначение Пример
plt.pcolor Рисование теплокарты plt.pcolor(data, vmin=0, vmax=3)
plt.imshow Рисование изображения plt.imshow(data, extent=[-3, 3, -3, 3], vmin=-1, vmax=1)
plt.contour Рисование контуров cnt_data = plt.contour(data, levels = [1,2,3], colors = 'white')
plt.contourf Рисование контуров cnt_data = plt.contour(data, levels = [1,2,3], colors = 'white')

Дополнительные методы для теплокарт

Метод Назначение Пример
plt.colorbar Рисование шкалы цвета plt.colorbar()
plt.clabel Рисование меток на контурах plt.clabel(cnt_data, inline=True, fontsize=10, fmt = '%2.0f', colors = 'white')

Гистограммы и барплоты

Метод Назначение Пример
plt.hist Гистограмма plt.hist(x, np.arange(0,3,1/5))
plt.bar Барплот plt.bar(ind, values, width)

Вспомогательные функции - надписи и подписи

Функция Назначение Пример использования
ax.set_xlabel Подпись оси X plt.xlabel("Подпись Х")
ax.set_ylabel Подпись оси Y plt.ylabel("Подпись Y")
ax.set_title Заголовок графика plt.title("Заголовок")
ax.legend Показать легенду plt.legend(loc='upper left')
ax.annotate Добавить аннотацию к точке xy ax.annotate('Максимум', xy=(2, 1))

В тексте можно использовать команды на TeXе окружая их знаками долларов: $4\pi^2$.

Вспомогательные функции - оси

Функция Назначение Пример использования
ax.set_xlim Границы по оси X plt.xlim(-4.0, 4.0)
ax.set_ylim Границы по оси Y plt.ylim(-3.0, 10.0)
ax.set_xticks Отсчеты по оси X plt.xticks([1, 2, 3, 4, 5])
ax.set_yticks Отсчеты по оси Y plt.yticks([1,2,3,], ['1a','2a','3a'])
ax.grid Включить сетку plt.grid(True)
ax.hlines Горизонтальные линии ax.hlines(3, -10, 10)
ax.vlines Вертикальные линии ax.vlines(3, -10, 10)

Функции объекта pyplot - Масштабы осей

Функция Назначение Пример использования
ax.set_xscale Масштаб по оси X ax.set_xscale("log")
ax.set_yscale Масштаб по оси Y ax.set_yscale("linear")
fig.add_subplot(polar=True) Создать систему полярных координат

Специальные построения: несколько систем координат

Использование модуля matplotlib.gridspec.

# Задаем сетку для деления 2 строки 3 столбца
grsp =  matplotlib.gridspec.GridSpec(2, 3)

# Получаем указатели на отельные оси с помощью слайсов
axis1 = fig.add_subplot(grsp[0, :]) # Вся верхняя строка
axis2 = fig.add_subplot(grsp[1, 0:2]) # Нижняя строка две левых клетки
axis3 = fig.add_subplot(grsp[1, 2]) #  Нижняя строка правый угол

Пример

Специальные построения: Теплокарты

Для построения теплокарты необходимо иметь двумерный массив с данными.

plt.imshow(data, extent=[-3, 3, -3, 3], origin='lower', cmap='YlGnBu')
plt.colorbar()

Выбираем нужный тип палитры на сайте matplotlib.

Пример

Управление расположением цветовой шкалы

from mpl_toolkits.axes_grid1 import make_axes_locatable

# находим нашу систему коордит в рамках Figure
divider = make_axes_locatable(ax)
# определяем новую область для рисования цветовой шкалы
color_ax = divider.new_horizontal(size="3%", pad=0.1, axes_class=plt.Axes)
# добавляем к фигуре новую область для цветовой шкалы
fig.add_axes(color_ax)
#рисуем шкалу
fig.colorbar(im, cax=color_ax)

Специальные построения: Контуры

Для построения контуров необходимо иметь: два одномерных массива с равномерными интервалами между точками и двумерный массив с данными. Ключевые методы plt.contour и plt.contourf.

Подготовка

# Источник данных — функция двух переменных
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 -y ** 2)

# Создаем массивы для осей:
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# Делаем мешгрид
gridX, gridY = np.meshgrid(x, y)
data = f(gridX, gridY)

Рисование

#Раскрашивание контуров цветами (палитра 'jet')
cntrf = plt.contourf(gridX, gridY, data, 8, alpha=.75, cmap='jet')

#Разграничение контуров линиями 
cntr = plt.contour(X, Y, f(X, Y), 8, colors='black')

#Добавляем подписи на контуры
plt.clabel(cntr, inline=1, fontsize=10)

#Добавляем цветовую легенду
plt.colorbar(cntrf)

Пример