Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Построение графиков
Наиболее распространенной библиотекой для построения 2D и 3D графиков является MatPlotLib (читается как мат-плот-либ). Данная библиотека позволяет процесс построения графиков как с использованием объектно-ориентированного, так и функционального подходов. Функциональный подход является наиболее простым и подходит для большинства задач, при желании достичь более точного контроля и расширенного функционала можно воспользоваться объектно-ориентированной реализацией.
Использование MatPlotLib в Jupyter обладает некоторой спецификой в связи с тем, что результирующие графики выводятся в виде статичных изображений, в отличии от запуска скриптов (файлов с разрешением .py), где графики выводятся в отдельных окнах с возможностью интерактивного взаимодействия с ними. Основным подмодулем в matplotlib является pyplot, который предоставляет основные функции для построения графиков. Общепринятым является импорт образом, представленным на рис. 1.
Рис. 1. Функциональный подход
На первой строчке осуществляется импорт pyplot с алиасом plt, а на второй самого модуля matplotlib с алиасом mpl.
Функциональный подход построения графиков с MatPlotLib, по своей сути, напоминает подход, реализованный в MATLAB. Модуль хранит промежуточные состояния фигур и все описанные изменения реализуются относительно последней объявленной фигуры. Для начала рассмотрим простейший пример построения графика синусоиды (Рис. 2.). Функция plot отвечает за построение графика, а функция show - за его отображение.
Рис. 2. График синусоиды
Существует несколько вариантов использования функции plot, в общем виде ее сигнатура выглядит следующим образом:
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
По сигнатуре видно, что функция plot может принимать несколько наборов данных одновременно, кроме того, при условии, что данные разделяются форматами (параметры fmt, fmt2 и тд.) можно не указывать независимую переменную, при этом ей будет автоматически назначен массив [0, 1, ..., n], где n - это количество элементов в массиве зависимой переменной.
Формат указывается как строка, содержащая определенный набор символов, который отвечает за стиль отображения данных и записывается в следующем порядке:
1. Маркер
2. Линия
3. Цвет
Возможные варианты всех указателей формата представлены в таблицах 1-3.
Таблица 1
Таблица 2
Таблица 3
Например, для того чтобы построить голубую пунктирную линию с кружками в ключевых точках следует использовать формат "o:b". Пример графика полученного с использованием функции plot в различных вариантах представлен на рисунке 3.
Рис. 3. График с различными стилями линий
Кроме функции plot, позволяющей решать большинство простых задач, существуют также и более специфичные функции. Список некоторых видов графиков представлен в таблице 4.
Таблица 4
Функция
Описание
semilogx(*args, **kwargs).
График с логарифмической шкалой абсцисс. Параметры аналогичны функции plot.
semilogy(*args, **kwargs)
График с логарифмической шкалой ординат. Параметры аналогичны функции plot.
loglog(*args, **kwargs)
График с логарифмической шкалой абсцисс и ординат. Параметры аналогичны функции plot.
scatter(x, y, **kwargs)
Диаграмма рассеяния
bar(x, height, **kwargs)
Столбчатая диаграмма
barh(x, width, **kwargs)
Горизонтальная столбчатая диаграмма.
stem([x,] y, **kwargs)
График дискретного ряда (stem-график)
pie(x, **kwargs)
Круговая диаграмма
hist(x[, bins], **kwargs)
Гистограмма.
streamplot(x, y, u, v, **kwargs)
Векторная диаграмма потоков
vlines(x, ymin, ymax, **kwargs)
Вертикальные линии.
imshow(X, **kwargs)
Отобразить данные как 2D изображение.
Для изменения характеристик фигуры, таких как подписи осей или легенда, предусмотрены контролирующие функции (Таблица 5).
Таблица 5
В качестве примера рассмотрим исходный код для создания графика (рис. 4 и рис. 5.), реализующий большую часть описанного функционала.
Рис. 4. Исходный код для построения сложного графика
Рис. 5 Результат выполнения кода рис. 4
Объектно-ориентированный подход является несколько более сложным в реализации по сравнению с функциональным подходом, однако позволяет достичь большего контроля над графиками. Основное отличие данной реализации заключается в том, что все взаимодействия происходят непосредственно с объектами фигур или графиков (осей) с помощью их полей и методов.
Практически все функции, представленные в таблицах 4 и 5, возвращают объект, который представляет собой внесенные изменения и реализует методы дальнейшего взаимодействия с ним с использованием ООП. Например, при вызове функции plot будет возвращаться объект matplotlib.lines.Line2D, а при вызове функции figure - matplotlib.figure.Figure. В связи с этим функциональный подход может быть переквалифицирован в объектно-ориентированный в практически любой момент. Однако существуют функции, которые непосредственно предназначены для использования с ООП (Таблица 6).
Таблица 6.
Основными классами являются matplotlib.figure.Figure и matplotlib.axes.Axes, и большинство манипуляций осуществляется с их экземплярами.
Для примера реализуем представленный на рисунке 6 график с применением ООП:
Рис. 6. Исходный код для построения графика с объектно-ориентированным подходом
Отличительной особенностью трехмерных графиков является необходимость использования ООП при их построении, поэтому вместо функций для построения используются методы класса Axes3D. Наиболее часто используемые типы трехмерных графиков представлены в таблице 7.
Таблица 7
Метод
Описание
scatter(xs, ys[, zs], **kwargs)
Трехмерная диаграмма рассеяния.
plot_wireframe(X, Y, Z, *args, **kwargs)
График поверхности в виде сетки.
plot_surface(X, Y, Z, *args, **kwargs)
График поверхности
Примеры построения графиков из таблицы 7 представлены на рис. 7 и 8.
Рис. 7. Исходный код для построения трехмерного графика
Рис. 8 Результат выполнения кода рис. 7