Компьютерная математика II

Дисциплина для студентов 1-го курса специальности «Компьютерная математика и системный анализ» ММФ БГУ

Тема 11. Пакет matplotlib для графического представления данных

доц. Лаврова О.А., кафедра дифференциальных уравнений и системного анализа (ауд. 329)

май, 2022

11.1 Пакет matplotlib

Пакет matplotlib предназначен для построения двумерных и трехмерных изображений в Python.

Первая версия пакета matplotlib создана в 2003 году (John D. Hunter). Текущая версия 3.5.1.

Пакет matplotlib содержит около 60 модулей.

Модуль matplotlib.pyplot предоставляет основной интерфейс для построения изображений.

Модули matplotlib.figure, matplotlib.axes, matplotlib.axis, matplotlib.lines, matplotlib.text, matplotlib.patches и др. являются вспомогательными для построения изображений и загружаются автоматически при импортировании модуля matplotlib.pyplot

Модуль matplotlib.pyplot предоставляет два подхода для построения изображений: процедурный подход и объектно-ориентированный подход.

При процедурном подходе изображения строятся с помощью функций модуля matplotlib.pyplot.

При объектно-ориентированный подходе изображения строятся на основе создания и настройки графических объектов, которые формируют объектную архитектуру изображения.

Объектно-ориентированный подход предоставляет больше возможностей для построения изображений, чем процедурный подход.

Пакет matplotlib очень похож на систему компьютерной математики для численных вычислений MATLAB как в возможностях для построения изображений, так и по синтаксису применения.

11.2 Создание графических окон и графических областей

Графическое окно является основным графическим объектом, объектом самого верхнего уровня для объектного представления matplotlib-изображения, объектом-контейнером, который будет содержать другие графические объекты.

Графическое окно является экземпляром класса Figure. Класс Figure расположен в модуле matplotlib.figure. Создать графическое окно можно с помощью функции figure модуля matplotlib.pyplot

При создании графического окна можно указать первым аргументом подпись графического окна. Указанием специальных ключевых аргументов можно задать свойства графического окна: размер в дюймах figsize, цвет фона facecolor, и т.д.

В графическом окне могут содержаться графические области. Графические области являются вторыми по важности графическими объектами-контейнерами в объектной иерархии представления matplotlib-изображения. Именно в графической области происходит формирование изображения.

При построении изображения важным является понятие текущее графическое окно и текущая графическая область. Действия по построению изображения осуществляются только в текущем графическом окне и только в текущей графической области.

Графическая область является экземпляром класса Axes или AxesSubplot. Класс Axes расположен в модуле matplotlib.axes. Создать графическое окно с одной графической областью можно с помощью функции axes модуля matplotlib.pyplot.

Создать графическое окно с одной графической областью можно также с помощью функции subplots модуля matplotlib.pyplot.

Каждая графическая область содержит координатные оси. При создании графической области координатные оси создаются автоматически.

Координатные оси являются экземплярами класса Axis. Класс Axis расположен в модуле matplotlib.axis. Создать координатные оси можно с помощью функции axis модуля matplotlib.pyplot. В качестве аргумента функции axis можно указать список с пределами для горизонтальной и вертикальной координатной осей

Функции xlim, ylim модуля matplotlib.pyplot также позволяют задать пределы для горизонтальной и вертикальной координатной осей, соответственно

Графическая область может содержать графические объекты и/или текстовые объекты для представления графиков и изображений.

Иерархическая структура matplotlib-изображения:

экземпляр класса Figure содержит экземплярЫ класса Axes
экземпляр класса Axes содержит экземплярЫ класса Axis и экземплярЫ классов Line2D, Text, Patch и др.

Явное создание сначала объекта графического окна, затем создание объекта графической области с последующим вызовом методов этих объектов относится к объектно-ориентированному подходу построения изображений.

Для создания нескольких графических областей в одном графическом окне можно использовать функцию subplot модуля matplotlib.pyplot. Функция

subplot(nrows, ncols, index)

вызывается с тремя аргументами. Аргументы nrows и ncols задают количество строк и столбцов таблицы в графическом окне, в ячейках которой могут располагаться графические области. Аргумент index определяет номер ячейки/ячеек, в которой будет создана графическая область. Ячейка в левом верхнем углу имеет порядковый номер 1. Далее номера ячеек последовательно увеличиваются при движении по таблице слева направо и сверху вниз.

Функция subplot также определяет, какая из графических областей будет текущей для выполнения действий

Функция savefig модуля matplotlib.pyplot позволяет сохранить текущее графическое окно в графические файлы различных форматов (png, pdf, gif, jpeg и др.) для дальнейшего использования изображения в других приложениях. Для файла обязательно указание расширения

11.3 Процедурный подход для построения двумерных графиков

Функция plot модуля matplotlib.pyplot используется для построения двумерных графиков в текущей графической области. Графики строятся по значениям абсцисс и ординат точек, представляющих график. Координаты точек задаются списками или массивами. Точки графика последовательно соединяются отрезками

При вызове функции plot автоматически создается графическое окно и графическая область, которые будут содержать построенный график. Вызов функции plot относится к процедурному подходу построения изображений средствами модуля matplotlib.pyplot.

Первым аргументом функции plot является NumPy-массив или список абсцисс точек, вторым аргументом является NumPy-массив или список ординат точек. Размеры первого и второго аргумента должны совпадать.

Внутренне списки с данными преобразуются в NumPy-массив при вызове функций модуля matplotlib.pyplot

Вызов функции plot с одним аргументом в виде NumPy-массива или списка изображает график по точкам, абсциссами которых являются индексы элементов NumPy-массив или список, а ординатами -- значения элементов NumPy-массива или списка.

Несколько графиков в одной графической области можно создать с помощью одиночного вызова функции plot. При этом координаты точек графика задаются последовательно друг за другом

Оформление графика

Для графика при его создании с помощью функции plot можно задать оформление указанием специальных ключевых аргументов: linestyle, linewidth, color, marker и т.д.

Ключевой аргумент linestyle задает стиль линии графика:

Ключевой аргумент linewidth задает толщину линии графика в пунктах. Значением по умолчанию является 1.5 пункта.

Ключевой аргумент color задает цвет линии графика. Существует несколько форматов представления цвета. Одним из форматов является использование строк с названием цвета: 'blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'white'. Формат для задания менне ярких цветов: 'tab:blue', 'tab:pink', 'tab:olive' и т.д.

Маркер -- это символ, выводимый в каждой точке данных графика. По умолчанию маркеры для точек графика не создаются. Ключевой аргумент marker задает тип маркера для точек гафика. Значением ключевого аргумента marker является специальный односимвольный строковый объект из одного символа, определяющий конкретный тип маркера. Всего определено 22 способа определения типа маркера. Например, 'o' задает маркер в виде кружка, . -- маркер в виде точки, '*' -- маркер в виде звездочки и т.д.

Свойства маркера задаются дополнительными ключевыми аргументами: цвет границы маркера markeredgecolor, толщина границы маркера markeredgewidth, цвет заливки маркера markerfacecolor, размер маркера в пунктах markersize

Функция plot возвращает список экземпляров класса Line2D для каждого из графиков в текущей графической области. Класс Line2D расположен в модуле matplotlib.lines

Функция scatter модуля matplotlib.pyplot используется для построения двумерных графиков в текущей графической области. Графики строятся по значениям абсцисс и ординат точек, представляющих график. Координаты точек задаются NumPy-массивами или списками. Точки графика НЕ соединяются отрезками

Синтаксис вызова функции plot и функции scatter очень похожи. В частности, многие ключевые аргументы для оформления графика, которые задаются при вызове функции plot, можно использовать также при вызове функции scatter

Функция grid модуля matplotlib.pyplot отображает сетку в текущей графической области с помощью вертикальных и горизонтальных прямых в графической области. Для линий сетки можно задать оформление указанием специальных ключевых аргументов: linestyle, linewidth, color, marker и т.д., как и для линий графика

Все функции данного подраздела относятся к процедурному подходу построения изображений средствами модуля matplotlib.pyplot.

Текстовое объекты в графической области

Добавление текстовых объектов в графическую область делает изображение более информативным.

Функции xlabel, ylabel модуля matplotlib.pyplot создают текстовые объекты в текущей графической области для представления подписей координатных осей. Первый аргумент является обязательным, он задает содержимое текстового объекта в виде строки.

Строка, являющаяся содержимым ЛЮБОГО текстового объекта, может быть запиcана с использованием языка разметки LaTeX для представления математического текста. Например, $\alpha -\frac{\sigma}{2}$ для отображения математического текста $\alpha -\frac{\sigma}{2}$. Перед строковым объектом с использованием языка разметки LaTeX стоит указать символ r, чтобы символ (\) не интерпретировался как часть управляющего символа.

Для ЛЮБОГО текстового объекта в графической области можно задать оформление текста указанием специальных ключевых аргументов: размер шрифта в пунктах fontsize, стиль шрифта fontstyle (например, 'italic', 'oblique', 'normal'), насыщенность шрифта fontweight (например, 'light', 'regular', 'bold', 'roman'), цвет текста color и т.д.

Функция title модуля matplotlib.pyplot создает текстовый объект в текущей графической области для представления заголовка графической области. Первый аргумент является обязательным, он задает содержимое текстового объекта. Дальнейшие аргументы являются необязательными и передаются по ключу. Специальный ключевой аргумент loc со значениями 'center', 'left', 'right' определяет выравнивание текста заголовка.

Функция text модуля matplotlib.pyplot создает текстовый объект в текущей графической области. Первые два аргумента функции text задают координаты левого нижнего угла текстовой области, третий аргумент задает содержимое текстового объекта. Дальнейшие аргументы являются необязательными, передаются по ключу и задают оформление текста

Ключевой аргумент bbox позволяет установить фон текстового объекта и, в частности, определить прозрачность 'alpha' для фонового цвета

Функция legend модуля matplotlib.pyplot создает текстовый объект в текущей графической области для представления подписей графиков. При создании графиков необходимо указание ключевого аргумента label. Значение ключевого аргумента задает подпись графика в виде строкового объекта, которая будет отображаться в легенде после вызова функции legend.

Текст подписи к графикам можно указать непосредственно при вызове функции legend. В этом случае функция legend вызывается с одним аргументом в виде списка с подписями к графикам

По умолчанию легенда располагается в верхнем левой углу графической области. Специальный ключевой аргумент loc со значениями 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center' определяет расположение легенды в графической области.

Оформление легенды можно задать с помощью специальных ключевых аргументов: размер шрифта fontsize, отображение рамки frameon, прозрачность framealpha, цвет заливки facecolor, цвет рамки edgecolor, текст заголовка title, размер шрифта заголовка title_fontsize и т.д.

Все функции данного подраздела относятся к процедурному подходу построения изображений средствами модуля matplotlib.pyplot.

Функции создания текстовых объектов xlabel, ylabel, title, text, возвращают экземпляры класса Text. Класс Text расположен в модуле matplotlib.text

11.4 Объектно-ориентированный подход для построения изображений

В пакете matplotlib определен абстрактный базовый класс Artist, от которого наследуются классы Figure, Axes, Axis, Line2D, Text, Patch и т.д. для создания графических объектов.

Двумерные фигуры определяются с помощью классов: Circle, Ellipse, Rectangle, Polygon и т.д., которые наследуются от класса Patch

Основные возможности построения изображения при использовании объектно-ориентированного подхода реализованы с помощью методов для объектов графических областей.

Для многих функций модуля matplotlib.pyplot существуют аналогичные методы класса Axes. Например, ax.axis(), ax.set_xlim,ax.set_ylim, ax.plot(), ax.grid(), ax.set_xlabel(), ax.set_ylabel(), ax.set_title(), ax.text(), ax.legend(), ax.set() и др.

Оформление графика можно задать с помощью специальных ключевых аргументов: linestyle, linewidth, color, marker и т.д., при вызове функции plot. Аналогичные действия можно выполнить вызовом соответствующих методов для объекта типа Line2D, представляющего график

Объекты двумерных фигур создаются с помощью конструкторов соответствующих классов. Добавление двумерных фигур в графическую область осуществляется с помощью вызова метода add_patch для объекта графической области