Почти все, кто
использует язык Python в научных целях, сталкивались с двумя
очень удобными и популярными пакетами:
- numpy – для быстрой
обработки матриц и векторов, а также эффективных вычислений на уровне
многочисленных математических функций;
- matplotlib – для
построения и отображения графиков самых разных форм и размеров.
Эти два пакета
полностью покрывают базовые потребности при научных расчетах и визуализации
данных. Я бы даже сказал, что они, своего рода, «убийцы» известного
математического пакета MatLab. Так как Python гораздо лучше
работает с большими массивами данных и, кроме того, полностью бесплатный. Тогда
как за MatLab в недалеком
прошлом приходилось платить аж целых 2000$.
Вероятно,
разработчики пакетов numpy и matplotlib также активно
использовали MatLab, так как
попытались сохранить некоторый синтаксис этого математического пакета. Вместе с
тем и numpy и matplotlib использую
концепцию ООП, что значительно упрощает работу с ними при разработке больших
проектов.
Пакет numpy мы с вами уже
рассматривали и, если кто не смотрел этот плейлист, то вот ссылка на него:
https://www.youtube.com/watch?v=eDuuKvIWzew&list=PLA0M1Bcd0w8zmegfAUfFMiACPKfdW4ifD
А, начиная с
этого занятия, мы будем изучать второй пакет – matplotlib. Конечно, я
затрону лишь основной функционал, покажу базовые возможности этого пакета,
которых, впрочем, будет достаточно, наверное, в 80-90% случаев. Все детали
рассматривать нет смысла, тогда занятия просто превратятся в большой
видео-справочник, который будет сложно воспринимать. Да и смысла большого в
таком изложении нет. Если потребуются реализовать какие-то редкие нюансы, то
это проще посмотреть или в интернете или в официальной документации по ссылке:
https://matplotlib.org/stable/contents.html
Кстати, полная
документация занимает более 3000 страниц. Так что можете представить, во что
превратились бы уроки подробного изложения возможностей matplotlib. Большинству
это ни к чему и я буду исходить из среднестатистических потребностей в
визуализации данных на графиках.
Установка пакета matplotlib
Как всегда, все
начинается с установки. Сделать это очень просто, достаточно в терминале
выполнить команду:
pip
install matplotlib
и пакет со всеми
зависимостями будет установлен. Также можно зайти в репозиторий:
https://pypi.org
набрать в поиске
matplotlib и появится
список доступных пакетов. По умолчанию, устанавливается последняя версия.
Согласно
документации:
https://matplotlib.org/stable/contents.html
для полноценной
работы matplotlib устанавливаются
следующие пакеты (зависимости):
-
NumPy
(>= 1.15)
-
setuptools
-
cycler
(>= 0.10.0)
-
dateutil
(>= 2.1)
-
kiwisolver
(>= 1.0.0)
-
Pillow
(>= 6.2)
-
pyparsing
(>=2.0.3)
И если с помощью
команды «pip list» вывести список
пакетов, то среди них должны быть и приведенные в списке.
Бекэнд matplotlib
Так как matplotlib выводит
графическую информацию, как правило, на экран устройства, то он должен
использовать пакет для работы с пользовательским интерфейсом. И, действительно,
по умолчанию в качестве backend применяется модуль:
TkInter
который, как
правило, поставляется с самим языком Python. И мы в этом
можем убедиться. Давайте создадим простейшую программу и, заодно проверим
корректность установки matplotlib:
import matplotlib
print(matplotlib.get_backend())
Мы здесь
импортировали модуль matplotlib и вызвали функцию get_backend() для получения
информации о текущем выбранном backend’е. У меня в консоли выводится
строка:
TkAgg
означающая, что
выбран TkInter в качестве backend’а. Если у вас по каким-то
причинам не установлен TkInter, то могут возникнуть проблемы при отображении
графиков. Если же мы хотите выбрать другой backend, то для этого
следует выполнить команду:
В данном случае
указан пакет Qt версии 5 для
отображения графической информации. Также backend можно «жестко»
прописать в файле конфигурации пакета matplotlib, чтобы каждый
раз в программе не вызывать функцию use().
Вообще,
поддерживаются следующие backend’ы:
Название
|
Описание
|
Qt5Agg
|
Рендеринг
графики в Qt5 (требуется PyQt5). В IPython активируется
командой %matplotlib qt5
|
ipympl
|
Рендеринг
графики в виджете Jupyter (требуется ipympl). В IPython активируется
командой %matplotlib ipympl
|
GTK3Agg
|
Рендеринг
графики в GTK 3.x (требуется
PyGObject и pycairo или cairocffi). В IPython активируется
командой %matplotlib gtk3
|
macosx
|
Рендеринг
графики в Cocoa. В IPython активируется командой
%matplotlib osx
|
TkAgg
|
Рендеринг
графики в Tk (требуется TkInter). В IPython активируется
командой %matplotlib tk
|
nbAgg
|
Рендеринг
графики в Jupyter notebook. В Jupyter активируется командой %matplotlib
notebook
|
WebAgg
|
Для
использования с торнадо-сервером.
|
GTK3Cairo
|
Cairo
рендеринг графики в GTK 3.x x (требуется PyGObject и pycairo или
cairocffi).
|
Qt4Agg
|
Рендеринг
графики в Qt4 (требуется PyQt4 или pyside). В IPython активируется
командой %matplotlib qt4
|
wxAgg
|
Рендеринг
графики в wxWidgets (требуется wxPython 4). В IPython активируется
командой %matplotlib wx
|
Мы будем пока
использовать стандартный модуль TkInter, чтобы не усложнять наши программы.
Архитектура окна графика
Давайте теперь
сформируем простой график и отобразим его в окне. Для этого нам нужно
импортировать специальный модуль pyplot пакета matplotlib:
import matplotlib.pyplot as plt
Обычно ему
присваивается алиас plt для дальнейшего удобства использования. Далее, мы
воспользуемся функцией plot() для отображения простейшей
кривой:
plt.plot([1, 2, -6, 0, 4])
В принципе,
этого достаточно, чтобы график был сформирован и отображен. Но при работе в
интегрированных средах, вроде PyCharm, окно с графиком тут же закроется.
Чтобы этого не происходило, добавим вызов еще одной функции:
Теперь мы видим
окно с графиком и элементами управления. Программа продолжит свою работу только
после закрытия этого окна.
Чтобы в
дальнейшем уметь управлять этим графиком, нужно понимать из каких компонент он
состоит.
Или, это можно
представить в виде схемы взаимодействия между компонентами окна:
На этом рисунке
показаны лишь базовые элементы графика. В действительности, их несколько
больше, но мы начнем с них. Итак, в основе всего лежит фигура (Figure) и она одна для
текущего окна. Затем, на фигуре располагаются координатные оси (Axes). Таких осей
(объектов Axes) может совсем
не быть, но, как правило, имеется хотя бы одна область. Также можно добавлять
две, три и так далее координатных осей на одну фигуру:
Каждый объект Axes содержит две или
три координатные оси (Axis), сетку, метки (ticks), легенду и,
конечно же, графики. Причем число графиков может быть произвольным – от нуля и
до любого разумного числа.
Объект Artist отвечает за
размещение и оформление отображаемых данных на рисунке (Figure) и
взаимодействует непосредственно с объектом Canvas – подложки для
рисования на холсте (рисунке).
Оси Axis в matplotlib могут иметь
разные конфигурации:
- в виде
декартовой системы на плоскости (2D) или в пространстве (3D);
- использовать
логарифмический масштаб по каждой из осей;
- описывать
сферическую систему координат.
Основные возможности matplotlib
С помощью matplotlib можно
отображать произвольные данные самыми разными способами в виде:
Наконец, matplotlib позволяет
создавать анимации отображаемых данных и сохранять их, например, в
анимированных GIF-файлах. Все это
и сделало данный пакет таким популярным и удобным в самых разных приложениях,
где необходимо отображать данные и визуально оценивать полученный результат.