Основы построения графиков#

Для построения графиков в Python разработано целое множество инструментов (библиотек): matplotlib, plotly, seaborn и др.

Каждый из указанных инструментов разработан для решения определённых задач. Например, библиотека matplotlib, разработанная в конце XX века в NASA, является универсальным инструментом построения графиков в окнах операционной системы: с её помощью можно строить самые разнообразные двухмерные и трёхмерные графики и даже создавать анимированные визуализации.

Остальные библиотеки визуализации данных вдохновлены matplotlib и упрощают создание сложных и красивых графиков. Так, с помощью plotly строят графики, с которыми можно взаимодействовать в браузере, так как данная библиотека основана на JavaScript. Такой подход значительно упрощает и совершенствует обмен результатами обработки данных между различными учёными, инженерами и их группами. Инструмент seaborn заточен под визуализацию статистических данных, поэтому нашёл широкое применение в науке о данных, машинном обучении и т.п.

Note

Всю необходимую информацию по наиболее распространённым способам визуализации данных вы можете найти в книге “Python для сложных задач”.

Note

Исчерпывающим источником информации по различным python-библиотекам является их документация.

В данном разделе мы рассмотрим основы создания графика только одним инструментом - matplotlib. Освоив его, вы с лёгкостью научитесь пользоваться любым другим пакетом визуализации данных в Python.

В качестве функции рассмотрим кубическую параболу:

\[ f(x) = x^3, \]

которую изобразим в пределах \(x \in [-2, 2]\).

Данные для визуализации#

Прежде чем построить какой-либо график, что-либо визуализировать, и не важно каким конкретно инструментом это самое что-либо нужно рассчитать или загрузить из базы данных. Мы будем рассчитывать. Опишем нашу функцию \(f(x)\):

def f_cubic(x):
    return x**3

Теперь инициализируем numpy-массив x из 101 значения в указанных выше пределах \(x \in [-2, 2]\):

import numpy as np

# Разобьём интервал на 100 отрезков
x = np.linspace(-2, 2, 101)

Вызываем f_cubic(...) и получаем массив y:

y = f_cubic(x)

Всё готово для построения графика.

matplotlib#

Для начала импортируем соответствующий инструмент - модуль pyplot. Это принято делать так:

import matplotlib.pyplot as plt

В пакете pyplot реализованы классы и функции построения графиков в Matlab-стиле.

pyplot построен в парадигме объектно-ориентированного программирования, т.е. графики (их оси, метки, линии и т.д.) являются объектами, хранящими в себе всю необходимую информацию. При этом существуют два подхода к визуализации с помощью pyplot:

  • стиль Matlab и

  • объектно-ориентированный стиль.

Стиль MATLAB#

График строится без явного создания объектов модуля pyplot.

plt.plot(x, y);
# Оператор ";" в данном случае нужен для того,
# чтобы не выводилась техническая информация о созданном окне.
# При запуске кода из консоли эта информация не будет выводиться,
# в таком случае оператор ";" ни на что не влияет.
../_images/0056193b0d9d62c2e5df2494a2221a2ff775906631063e3d5ad3ad3423b1f37f.png

Только и всего!

Объектно-ориентированный стиль#

В этом случае мы явно создаём фигуру (рисунок) типа plt.figure и ось типа plt.axis. Сделать это можно несколькими способами. Например, так:

fig = plt.figure()
ax = fig.add_axes([.1, .1, .8, .8])
# Список, переданный add_axes(...) в качестве аргумента,
# описывает прямоугольник "рабочего поля" (оси plt.axis) -
# то, что очерчено чёрными осями.
# Первые два значения - координата левой нижней точки прямоугольника
# в относительных (от 0 до 1) координатах окна;
# вторые два значения - ширина и высота этого прямоугольника
# в тех же координатах.
../_images/2a9207adb8f4839de74cc859297fd339d99a2a3494d09f166a3d249afc211621.png

Или с помощью функции plt.subplots, которая возвращает кортеж вида (plt.figure, plt.axes):

fig, ax = plt.subplots()
# Кортеж сразу распакован
../_images/55ad6f09974659058ed6ec303b68ef045c7c70849e2cd3bc6219f19b28ba7860.png

Attention

axis - это ось, ед. число; axes - оси во множ. числе.

В общем случае plt.subplots возвращает массив осей, но по умолчанию ось всего одна, поэтому возвращённый экземпляр в данном случае имеет тип plt.axis вместо plt.axes.

Теперь у нас есть два объекта с именами fig (фигура, рисунок, окно типа plt.figure) и ax (ось типа plt.axis). В терминах matplotlib fig - это окно, т.е. весь рисунок выше; ax - это область, ограниченная числовыми осями графика.

Отрисовка происходит непосредственно через объект оси ax:

fig, ax = plt.subplots()
ax.plot(x, y);
../_images/0056193b0d9d62c2e5df2494a2221a2ff775906631063e3d5ad3ad3423b1f37f.png

Note

Может возникнуть вопрос. Зачем создавать объекты явно (2 или 3 строки кода) вместо того, чтобы использовать неявный метод (1 строка кода)? Дело в том, что явным методом возможно строить очень сложные графики, в т.ч. трёхмерные. Неявный метод для этого не подходит.

Вот таким образом строятся плоские графики с помощью matplotlib.