Matplotlib. Урок 2. Работа с инструментом pyplot

Автор: | 03.09.2019

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

Для того, чтобы запустить любой из примеров, продемонстрированных в первом уроке (Matplolib. Урок 1. Быстрый старт), вам предварительно нужно было импортировать pyplot из библиотеки Matplolib. В настоящее время среди пользователей этого инструмента принято импорт производить следующим образом:

import matplotlib.pyplot as plt

Создатели Matplolib постарались сделать его похожим в использовании на MATLAB, так что если вы знакомы с последним, то разобраться с библиотекой будет проще.

Основы работы с pyplot

Построение графиков

Основным элементом изображения, которое строит pyplot является Фигура (Figure), на нее накладываются один или более графиков, осей, надписей и т.п. Для построения графика используется команда plot(). В самом минимальном варианте можно ее использовать без параметров:

import matplotlib.pyplot as plt
%matplotlib inline
plt.plot()

В результате будет выведено пустое поле:

Далее команду импорта и magic-команду для Jupyter (первая и вторая строки приведенной выше программы) мы использовать не будем. 

Если в качестве параметра функции plot() передать список, то значения из этого списка будут отложены по оси ординат (ось y), а по оси абсцисс (ось x) будут отложены индексы элементов массива:

plt.plot([1, 7, 3, 5, 11, 1])

Для того, чтобы задать значения по осям x и y необходимо в plot() передать два списка:

plt.plot([1, 5, 10, 15, 20], [1, 7, 3, 5, 11])

Текстовые надписи на графике

Наиболее часто используемые текстовые надписи на графике это:

  • наименование осей;
  • наименование самого графика;
  • текстовое примечание на поле с графиком;
  • легенда.

Рассмотрим кратко данные элементы, более подробный рассказ о них будет в одном из ближайших уроков.

Наименование осей

Для задания подписи оси x используется функция xlabel(), оси yylabel(). Разберемся с аргументами данных функций. Здесь и далее аргументы будем описывать следующим образом:

  • Имя_аргумента: тип(ы)
    • Описание

Для функций xlabel()/ylabel() основными являются следующие аргументы:

  • xlabel (или ylabel):str
    • Текст подписи.
  • labelpad : численное значение либо None; значение по умолчанию: None
    • Расстояние между областью графика, включающую оси, и меткой.

Функции xlabel()/ylabel() принимают в качестве аргументов параметры конструктора класса matplotlib.text.Text, некоторые из них нам могут пригодиться:

  • fontsize или size: число либо значение из списка: {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}.
    • Размер шрифта.
  • fontstyle: значение из списка: {‘normal’, ‘italic’, ‘oblique’}.
    • Стиль шрифта.
  • fontweight: число в диапазоне от 0 до 1000 либо значение из списка: {‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’}.
    • Толщина шрифта.
  • color: одни из доступных способов определения цвета см. Цвет линии.
    • Цвет шрифта.

Пример использования:

plt.xlabel('Day', fontsize=15, color='blue')

Аргументов у этих функций довольно много и они позволяют достаточно тонко настроить внешний вид надписей. В рамках этого урока мы только начинаем знакомиться с инструментом pyplot поэтому не будем приводить весь список.

Заголовок графика

Для задания заголовка графика используется функция title():

plt.title('Chart price', fontsize=17)

Из параметров отметим следующие:

  • label: str
    • Текст заголовка.
  • loc: значение из набора {‘center‘, ‘left‘, ‘right‘}
    • Выравнивание заголовка.

Для функции title() также доступны параметры конструктора класса matplotlib.text.Text, часть из них представлена в описании аргументов функций xlabel() / ylabel().

Текстовое примечание

За размещение текста на поле графика отвечает функция text(), которой вначале передаются координаты позиции надписи, после этого – текст самой надписи.

plt.text(1, 1, 'type: Steel')

Легенда

Легенда будет размещена на графике, если вызвать функцию legend(), в рамках данного урока мы не будем рассматривать аргументы этой функции.

Разместим на уже знакомом нам графике необходимый набор подписей.

x = [1, 5, 10, 15, 20]
y = [1, 7, 3, 5, 11]
plt.plot(x, y, label='steel price')
plt.title('Chart price', fontsize=15)
plt.xlabel('Day', fontsize=12, color='blue')
plt.ylabel('Price', fontsize=12, color='blue')
plt.legend()
plt.grid(True)
plt.text(15, 4, 'grow up!')

К перечисленным опциям мы добавили сетку, которая включается с помощью функции grid(True).

Работа с линейным графиком

В этом параграфе мы рассмотрим основные параметры и способы их задания для изменения внешнего вида линейного графика. Matplotlib предоставляет огромное количество инструментов для построения различных видов графиков. Так как наиболее часто встречающийся вид графика – это линейный, ему и уделим внимание. Необходимо помнить, что настройка графиков других видов, будет осуществляться сходным образом.

Параметры, которые отвечают за отображение графика можно задать непосредственно в самой функции plot():

plt.plot(x, y, color='red')

Либо воспользоваться функцией setp(), через которую можно модифицировать нужные параметры:

plt.setp( color='red', linewidth=1)

Стиль линии графика

Стиль линии графика задается через параметр linestyle, который может принимать значения из приведенной ниже таблицы.

Значение параметра Описание
‘-‘ или ‘solid’ Непрерывная линия
‘–‘ или ‘dashed’ Штриховая линия
‘-.’ или ‘dashdot’ Штрихпунктирная линия
‘:’ или ‘dotted’ Пунктирная линия
‘None’ или ‘ ‘ или ” Не отображать линию

Стиль линии можно передать сразу после указания списков с координатами без указания, что это параметр linewidth.

x = [1, 5, 10, 15, 20]
y = [1, 7, 3, 5, 11]
plt.plot(x, y, '--')

Либо можно воспользоваться функцией setp():

x = [1, 5, 10, 15, 20]
y = [1, 7, 3, 5, 11]
line = plt.plot(x, y)
plt.setp(line, linestyle='--')

Результат будет тот же, что на рисунке выше.

Для того, чтобы вывести несколько графиков на одном поле необходимо передать соответствующие наборы значений в функцию plot(). Построим несколько наборов данных и выведем их с использованием различных стилей линии:

x = [1, 5, 10, 15, 20]
y1 = [1, 7, 3, 5, 11]
y2 = [i*1.2 + 1 for i in y1]
y3 = [i*1.2 + 1 for i in y2]
y4 = [i*1.2 + 1 for i in y3]
plt.plot(x, y1, '-', x, y2, '--', x, y3, '-.', x, y4, ':')

Тот же результат можно получить, вызвав plot() для построения каждого графика по отдельности. Если вы хотите представить каждый график отдельно на своем поле, то используйте для этого subplot() (см. Размещение графиков на разных полях)

plt.plot(x, y1, '-')
plt.plot(x, y2, '--')
plt.plot(x, y3, '-.')
plt.plot(x, y4, ':')

Цвет линии

Задание цвета линии графика производится через параметр color (или c, если использовать сокращенный вариант). Значение может быть представлено в одном из следующих форматов:

  • RGB или RGBA кортеж значений с плавающей точкой в диапазоне [0, 1] (пример: (0.1, 0.2, 0.3)
  • RGB или RGBA значение в hex формате (пример: ‘#0a0a0a’)
  • строковое представление числа с плавающей точкой в диапазоне [0, 1] (определяет цвет в шкале серого) (пример: ‘0.7’)
  • символ из набора {‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’}
  • имя цвета из палитры X11/CSS4 
  • цвет из палитры xkcd(https://xkcd.com/color/rgb/), должен начинаться с префикса ‘xkcd:’
  • цвет из набора  Tableau Color (палитра T10), должен начинаться с префикса ‘tab:’ 

Если цвет задается с помощью символа из набора {‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’}, то он может быть совмещен со стилем линии в рамках параметра fmt функции plot().

Например штриховая красная линия будет задаваться так: ‘–r’, а штрих пунктирная зеленая так ‘-.g’

x = [1, 5, 10, 15, 20]
y = [1, 7, 3, 5, 11]
plt.plot(x, y, '--r')

Тип графика

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

plt.plot(x, y, 'ro')

plt.plot(x, y, 'bx')

Размер маркера можно менять, об этом более подробно будет рассмотрено в уроке, посвященном точечным графикам.

Размещение графиков на разных полях

Существуют три основных подхода к размещению нескольких графиков на разных полях:

  • использование функции subplot() для указания места размещения поля с графиком;
  • использование функции subplots() для предварительного задания сетки, в которую будут укладываться поля;
  • использование GridSpec, для более гибкого задания геометрии размещения полей с графиками в сетке.

В этом уроке будут рассмотрены первые два подхода.

Работа с функцией subplot()

Самый простой способ представить графики в отдельных полях – это использовать функцию supplot() для задания их мест размещения. До этого момента мы не работали с Фигурой (Figure) напрямую, значения ее параметров, задаваемые по умолчанию, нас устраивали. Для решения текущей задачи придется один из параметров – размер подложки, задать вручную. За это отвечает аргумент figsize функции figure(), которому присваивается кортеж из двух float элементов, определяющих высоту и ширину подложки.

После задания размера, указывается местоположение, куда будет установлено поле с графиком с помощью функции subplot(). Чаще всего используют следующие варианты вызова subplot:

subplot(nrows, ncols, index)

  • nrows: int
    • Количество строк.
  • ncols: int
    • Количество столбцов.
  • index: int
    • Местоположение элемента.

subplot(pos)

  • pos:int
    • Позиция, в виде трехзначного числа, содержащего информацию о количестве строк, столбцов и индексе, например 212, означает подготовить разметку с двумя строками и одним столбцов, элемент вывести в первую позицию второй строки. Этот вариант можно использовать, если количество строк и столбцов сетки не более 10, в ином случае лучше обратиться к первому варианту.

Рассмотрим на примере работу с данными функциями:

# Исходный набор данных
x = [1, 5, 10, 15, 20]
y1 = [1, 7, 3, 5, 11]
y2 = [i*1.2 + 1 for i in y1]
y3 = [i*1.2 + 1 for i in y2]
y4 = [i*1.2 + 1 for i in y3]

# Настройка размеров подложки
plt.figure(figsize=(12, 7))

# Вывод графиков
plt.subplot(2, 2, 1)
plt.plot(x, y1, '-')
plt.subplot(2, 2, 2)
plt.plot(x, y2, '--')
plt.subplot(2, 2, 3)
plt.plot(x, y3, '-.')
plt.subplot(2, 2, 4)
plt.plot(x, y4, ':')

Второй вариант использования subplot():

# Вывод графиков
plt.subplot(221)
plt.plot(x, y1, '-')
plt.subplot(222)
plt.plot(x, y2, '--')
plt.subplot(223)
plt.plot(x, y3, '-.')
plt.subplot(224)
plt.plot(x, y4, ':')

Работа с функцией subplots()

Одно из неудобств использования последовательного вызова функций subplot() заключается в том, что каждый раз приходится указывать количество строк и столбцов сетки. Для того, чтобы этого избежать, можно воспользоваться функцией subplots(), из всех ее параметров, нас пока интересуют только первые два, через них передается количество строк и столбцов сетки. Функция subplots() возвращает два объекта, первый – это Figure, подложка, на которой будут размещены поля с графиками, второй – объект или массив объектов Axes, через которые можно получить полных доступ к настройке внешнего вида отображаемых элементов.

Решим задачу вывода четырех графиков с помощью функции subplots():

fig, axs = plt.subplots(2, 2, figsize=(12, 7))
axs[0, 0].plot(x, y1, '-')
axs[0, 1].plot(x, y2, '--')
axs[1, 0].plot(x, y3, '-.')
axs[1, 1].plot(x, y4, ':')

Результат будет аналогичный тому, что приведен в разделе “Работа с функцией subplot()”.

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта. Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Книга: Линейная алгебра на Python
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas.  Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

Поделиться
Share on VK
VK
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *