12.1. Теория

Текст является одним из лучших способов передачи информации, однако, в ряде случаев, как гласит известная поговорка, «лучше один раз увидеть, чем сто раз услышать».

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

12.1.1. Описание и установка

Matplotlib распространяется на условиях BSD-подобной лицензии. Библиотека поддерживает двумерную (2D) и трехмерную (3D) графику, а также анимированные рисунки.

Создаваемые изображения могут быть использованы в мультимедийных приложениях, научных проектах, а также различных документах, публикациях и веб-приложениях. Исторически библиотека формировалась под влиянием математического пакета Matlab, но являлась и является независимым от него проектом. Построенная на принципах ООП, библиотека также имеет процедурный интерфейс pylab, который предоставляет аналоги команд Matlab.

Последняя стабильная версия библиотеки поддерживает Python 2.6 и выше. В курсе рассматривается matplotlib версии 2+.

Пакет поддерживает многие виды диаграмм:

  • графики;

  • диаграммы разброса;

  • столбчатые диаграммы и гистограммы;

  • круговые диаграммы;

  • ствол-лист диаграммы;

  • контурные графики;

  • поля градиентов;

  • спектральные диаграммы

  • и др.

При построении возможно указать оси координат, сетку, добавить аннотации, использовать логарифмическую шкалу или полярные координаты. Созданные изображения могут быть легко сохранены, в частности, в популярные форматы (JPEG, PNG и др.).

Пример изображений приведен на Рисунке 12.1.1.

_images/12_01_01.png

Рисунок 12.1.1 - Пример изображений, построенных с использованием matplotlib [10]

На странице скриншотов, а также в демонстрационной галерее библиотеки приведен обширный список примеров, включающих изображения и соответствующий код.

Установка

Как и любой пакет matplotlib можно установить, используя утилиту pip:

pip install matplotlib
pip install matplotlib --upgrade

Пользователям ОС на базе Linux можно воспользоваться пакетным менеджером и установить python3-matplotlib.

После установки проверьте, что библиотека имеет версию 3 и выше:

>>> import matplotlib
>>> matplotlib.__version__
'3.1.2'

Дополнительная информация об установке находится в официальном руководстве по инсталляции.

12.1.2. Основы matplotlib

В matplotlib все объекты организованы в единую иерархию:

  1. На вершине иерархии находится конечный автомат (модель, число возможных внутренних состояний которой конечно), предоставляемый модулем matplotlib.pyplot. На данном уровне все функции, используемые для рисования диаграмм (линии, рисунки, текст и т.д.) применяются к текущему изображению.

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

12.1.2.1. Типы используемых величин

Все функции построения диаграмм ожидают аргументы следующих типов:

  • np.array,

  • np.ma.masked_array

- набор или массив значений из пакета NumPy (устанавливается вместе с matplotlib), однако стандартные последовательности Python также допускаются к использованию.

Примечание

NumPy - фундаментальный пакет для научных вычислений на Python, который содержит:

  • мощный объект - многомерный массив (в т.ч. матрицы);

  • высокоуровневые функции для работы с массивами, линейной алгеброй и а также быстрого создания набора данных (примерный аналог - функция range());

  • инструменты для интеграции кода на C/C++ и Fortran.

Пакет NumPy не рассматривается отдельно в данном курсе.

12.1.2.2. Основные модули и классы matplotlib

12.1.2.2.1. Модуль matplotlib

Модуль верхнего уровня matplotlib содержит функции для конфигурации библиотеки.

matplotlib.rc(group, **kwargs)

Устанавливает параметры **kwargs для группы объектов group (например, "font" для шрифта).

Примечание

Данная функция может оказаться полезной, если шрифт в ОС по умолчанию не поддерживает кириллицу:

import matplotlib

# "Включение" поддержки кириллицы
matplotlib.rc("font", family="Arial, Ubuntu")

12.1.2.2.2. Элементы изображения

На Рисунке 12.1.2 представлены основные элементы изображения.

_images/12_01_02.png

Рисунок 12.1.2 - Основные элементы изображения в matplotlib

Изображение может содержать несколько диаграмм, каждая из которых будет представлять собой Рисунок 12.1.2.

Все элементы изображения унаследованы от класса Artists (модуль artist) и делятся на 2 типа:

  1. Примитивы:

    Стандартные графические объекты на изображении: линия (класс Line2D), прямоугольник (класс Rectangle), текст (класс Text) и т.д.

  2. Контейнеры:

    Контейнеры - объекты, внутри которых размещаются примитивы: координатная плоскость (класс Axes), оси (класс Axis) или изображение (класс Figure).

12.1.3. Создание изображений

12.1.3.1. Построение простой диаграммы

Типичный ход построения изображения, как правило, включает следующие шаги:

  1. Создать объект Figure.

  2. Используя объект Figure, добавить координатную плоскость Axes (одну или несколько).

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

  4. Отобразить и/или сохранить изображение.

Пример построения изображения приведен в Листинге 12.1.1.

Листинг 12.1.1 - Общий ход построения изображений, используя matplotlib | скачать
 1# 1) Подключение необходимых библиотек
 2import numpy as np
 3import matplotlib
 4import matplotlib.pyplot as plt
 5
 6if __name__ == "__main__":
 7
 8    # 1.1) "Включение" поддержки кириллицы (при необходимости)
 9    # matplotlib.rc("font", family="Arial, Ubuntu")
10
11    # 2) Формирование данных и построение диаграммы
12    x = np.arange(-8, 3, 0.1)  # x - массив np.array
13    y = abs(x**2 + 4*x - 5)
14
15    # Вызов диаграммы нужного типа
16    fig, ax = plt.subplots()
17    fig.canvas.set_window_title("Мое первое изображение")  # Заголовок окна
18
19    ax.grid(True)  # Отображение сетки на координатной плоскости
20    ax.plot(x, y, 'r', linewidth=3)  # График красного цвета
21
22    # 3) Вывод результата
23    plt.savefig("my_image.png")  # Сохранение изображения
24    # или
25    plt.show()  # Вывод изображения на экран

Одним из способом создания изображения и координатной оси является функция pyplot.subplots().

matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

Некоторые параметры:

Параметры:
  • nrows (int) – количество координатных плоскостей по вертикали;

  • ncols (int) – количество координатных плоскостей по горизонтали;

  • sharex (bool или {"none", "all", "row", "col"}) –

    является ли ось OX общей для нескольких плоскостей:

    • True или "all": оси OX и OY будут общими для всех координатных плоскостей;

    • False или "none": оси OX и OY будут отдельными для каждой координатной плоскости;

    • "row": оси OX и OY будут общими для всех координатных плоскостей по вертикали;

    • "col": оси OX и OY будут общими для всех координатных плоскостей по горизонтали.

  • sharey (bool или {"none", "all", "row", "col"}) – является ли ось OY общей для нескольких плоскостей (аналогично параметру „sharex“);

Результат:

кортеж:

  • fig: изображение (класс Figure);

  • ax: одна или несколько координатных плоскостей (класс Axes).

Для вывода полученного изображения на экран используется функция pyplot.show().

matplotlib.pyplot.show(*args, **kw)

Выводит изображение на экран в отдельном окне (Рисунок 12.1.3).

_images/12_01_03.png

Рисунок 12.1.3 - Выполнение кода из Листинга 12.1.1.

Кроме диаграммы графическое окно содержит специальные функциональные кнопки (интерактивную навигацию, пронумерована на Рисунке 12.1.3), их назначение и возможности приведены в Таблице 12.1.1.

Таблица 12.1.1 - Интерактивная навигация графического окна

Номер(а)

Описание

1

Возвращает график к первоначальному состоянию (вид при первом запуске)

2, 3

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

4

Перетаскивает (левая кнопка мыши) или масштабирует (правая кнопка мыши) график

5

Масштабирует заданную прямоугольную область графика

6

Открывает дополнительные настройки окна (например, отступы от краев)

7

Вызывает диалог сохранения графика в файл

Сохранение получившегося изображения также может быть выполнено программно, используя функцию pyplot.savefig().

matplotlib.pyplot.savefig(fname, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, transparent=False, bbox_inches=None, pad_inches=0.1, frameon=None)

Сохраняет текущее изображение.

Обязательный параметр:

Параметры:

fname – имя файла или файловый объект.

Необязательные параметры контролируют значения dpi (англ. Dots Per Inch - количество точек на дюйм), ориентацию (альбомная или портретная), прозрачность, отступы и т.д.

12.1.3.2. Заголовок диаграммы и подписи осей

Диаграмма в maplotlib может иметь:

matplotlib.pyplot.set_title(label, fontdict=None, loc='center', **kwargs)

Установить заголовок диаграммы.

Обязательный параметр:

Параметры:

label (str) – заголовок диаграммы.

Результат:

текст (класс Text).

class matplotlib.pyplot.Axes
set_xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)

Установить подпись оси OX.

Обязательный параметр:

Параметры:

xlabel (str) – подпись оси OX.

set_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)

Установить подпись оси OY.

Обязательный параметр:

Параметры:

ylabel (str) – подпись оси OY.

12.1.3.3. Координатная сетка и масштабирование

Координатная плоскость поддерживает настройку:

class matplotlib.pyplot.Axes
grid(b=None, which='major', axis='both', **kwargs)

Отобразить сетку координатной плоскости.

Некоторые параметры:

Параметры:

b (bool или {"on", "off"}) – отображает сетку, если b - True или "on".

set_aspect(aspect, adjustable=None, anchor=None)

Установить соотношение сторон (осей) координатной плоскости.

Некоторые параметры:

Параметры:

aspect –

  • "auto" (по умолчанию): максимальное заполнение координатной плоскости;

  • "equal": соотношение осей OX и OY как 1:1;

  • num: ось OY растянута в num раз больше, чем OX.

set_xlim(left=None, right=None, emit=True, auto=False, **kw)

Установить пределы значений [left; right] по оси OX.

Результат:

кортеж - новые пределы по оси OX.

Тип результата:

tuple

set_ylim(bottom=None, top=None, emit=True, auto=False, **kw)

Установить пределы значений [bottom; top] по оси OY.

Результат:

кортеж - новые пределы по оси OY.

Тип результата:

tuple

spines

Словарь - линии осей координат (класс Spines):

  • "left" (левая);

  • "bottom" (нижняя);

  • "right" (правая);

  • "top" (верхняя).

Для изменения позиции конкретной линии оси координат используется метод Spines.set_position().

class Spines
set_position(position)

Перемещает линию оси координат в позицию position.

12.1.3.4. Легенда

Matplotlib также поддерживает добавление легенды - условного обозначения значений различных рядов данных на диаграмме (метод Axes.legend()).

class matplotlib.pyplot.Axes
legend(*args, **kwargs)

Размещает легенду на координатной плоскости.

Некоторые параметры:

Параметры:

loc –

положение легенды:

  • "best" (авто-размещение);

  • "upper right" (по умолчанию),

  • "upper left";

  • "lower left";

  • "lower right";

  • "right";

  • "center left";

  • "center right";

  • "lower center";

  • "upper center";

  • "center".

12.1.3.5. Текст и аннотациии

На диаграмму также имеется возможность добавить:

Текст в matplotlib поддерживает известный научный формат TeX (произносится как «тех»), позволяющий записывать сложные математические выражения.

class matplotlib.pyplot.Axes
text(x, y, s, fontdict=None, withdash=False, **kwargs)

Добавляет текст s на координатную плоскость в координаты (x, y) (левый верхний угол).

Возможные ключи **kwargs - свойства текстового объекта (класс Text), определяющие отображение текста.

annotate(*args, **kwargs)

Добавляет аннотацию s на координатную плоскость в координаты (x, y).

Некоторые параметры:

Параметры:
  • s (str) – текст аннотации;

  • xy (итерируемый объект из 2-х элементов) – координаты точки аннотации;

  • xytext (итерируемый объект из 2-х элементов) – координаты текста аннотации (по умолчанию равен параметру „xy“, левый верхний угол);

  • arrowprops (dict) – свойства стрелки-указателя на аннотацию.

В Листинге 12.1.2 и на Рисунке 12.1.4 приведен пример использования ряда функций для построения диаграммы.

Листинг 12.1.2 - Заголовки, подписи и другие элементы графика в matplotlib | скачать
 1import numpy as np
 2import matplotlib
 3import matplotlib.pyplot as plt
 4
 5if __name__ == "__main__":
 6
 7    x = np.arange(-8, 3, 0.1)  # x - массив np.array
 8    y1 = abs(x**2 + 4*x - 5)
 9    y2 = [9] * len(x)
10
11    fig, ax = plt.subplots()
12    fig.canvas.set_window_title("Графики функций")
13
14    # Настройки диаграммы и осей
15    ax.set_title("Графики функций: экстремум")
16    ax.set_xlabel("Ось абсцисс")
17    ax.set_ylabel("Ось ординат")
18    ax.grid(True)
19
20    # 2 графика
21    ax.plot(x, y1, 'r', linewidth=3, label="Парабола")
22    ax.plot(x, y2, label="Линия")
23
24    # Аннотации и текст
25    ax.annotate(r"Экстремум функции = $\frac{-b}{2a} = \frac{-4}{2} = -2$",
26                xy=(-2, 9), xytext=(-4.8, 15.5),
27                arrowprops=dict(facecolor="black", shrink=0.05))
28    ax.text(-7, 24.5, "На диаграмме 2 графика:\nпарабола и линия экстремума")
29
30    # Легенда
31    ax.legend()
32
33    plt.show()
_images/12_01_04.png

Рисунок 12.1.4 - Заголовки, подписи и другие элементы графика в matplotlib

12.1.3.6. Несколько диаграмм в изображении

В ряде случаев удобно иметь несколько диаграмм в рамках одного изображения. matplotlib позволяет это сделать, используя функцию matplotlib.pyplot.subplots(), указав параметры разбиения изображения (Листинге 12.1.3, Рисунок 12.1.5).

Листинг 12.1.3 - Несколько диаграмм в изображении в matplotlib | скачать
 1import numpy as np
 2import matplotlib
 3import matplotlib.pyplot as plt
 4
 5if __name__ == "__main__":
 6
 7    x = np.arange(-8, 3, 0.1)  # x - массив np.array
 8    y1 = abs(x**2 + 4*x - 5)
 9    y2 = [9] * len(x)
10
11    fig, (ax1, ax2) = plt.subplots(ncols=2)  # 2 диаграммы по горизонтали
12    fig.canvas.set_window_title("Графики функций")
13
14    # 1) 1-й график
15
16    # Настройки диаграммы и осей
17    ax1.set_title("Графики функций: экстремум")
18    ax1.set_xlabel("Ось абсцисс")
19    ax1.set_ylabel("Ось ординат")
20    ax1.grid(True)
21
22    # 2 графика
23    ax1.plot(x, y1, 'r', linewidth=3, label="Парабола")
24    ax1.plot(x, y2, label="Линия")
25
26    # Аннотации и текст
27    ax1.annotate(r"Экстремум функции = $\frac{-b}{2a} = \frac{-4}{2} = -2$",
28                xy=(-2, 9), xytext=(-4.8, 15.5),
29                arrowprops=dict(facecolor="black", shrink=0.05))
30    ax1.text(-7, 24.5, "На диаграмме 2 графика:\nпарабола и линия экстремума")
31
32    # Легенда
33    ax1.legend()
34
35    # 2) 2-й график
36
37    # Настройки диаграммы и осей
38    ax2.set_title("Графики функций: корни уравнения")
39
40    # 3 графика
41    y2 = list(range(-20, 21))
42    x2 = [-5] * len(y2)
43    x3 = [1] * len(y2)
44
45    ax2.plot(x, y1, linewidth=3, label="Парабола")
46    ax2.plot(x2, y2, label="Корень 1")
47    ax2.plot(x3, y2, label="Корень 2")
48
49    # Аннотации и текст
50    ax2.text(-2, 27, "На диаграмме 3 графика:\nпарабола и корни",
51             horizontalalignment="center")
52    ax2.annotate("Корень 1 = -5", xy=(-5, -1.5), xytext=(-10, -5),
53                 arrowprops=dict(
54                    facecolor="black", connectionstyle="angle3",
55                    arrowstyle="->"
56                ))
57    ax2.annotate("Корень 2 = 1", xy=(1, -1.5), xytext=(2, -8),
58                 arrowprops=dict(
59                    facecolor="black", connectionstyle="angle3",
60                    arrowstyle="->"
61                ))
62
63    ax2.set_xlim(-10, 10)
64    ax2.set_ylim(-10, 10)
65    ax2.spines["left"].set_position("center")
66    ax2.spines["bottom"].set_position("center")
67    ax2.spines['top'].set_visible(False)
68    ax2.spines['right'].set_visible(False)
69
70    # Легенда
71    ax2.legend(loc="best")
72
73    plt.show()
_images/12_01_05.png

Рисунок 12.1.5 - Несколько диаграмм в изображении в matplotlib

Доступ к любой из координатных плоскостей можно получить сохранив их при вызове функции matplotlib.pyplot.subplots() или через функцию Figure.get_axes().

12.1.4. Основные типы диаграмм

Класс matplotlib.axes.Axes содержит множество методов для рисования диаграмм различного типа (Таблица 12.1.2).

Таблица 12.1.2 - Основные типы диаграмм [6] [7] [8] [9]

Тип

Метод Axes

Пример

График

Axes.plot()

_images/12_01_01_i.png

Круговая диаграмма

Axes.pie()

_images/12_01_02_i.png

Столбчатая (линейчатая) диаграмма

Axes.bar(), Axes.barh()

_images/12_01_03_i.png

Гистограмма

Axes.hist()

_images/12_01_04_i.png

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

12.1.4.1. График

График (в т.ч. точечная диаграмма) является одним из самых простых способов отображения зависимости в графическом виде и может быть нарисован с использованием метода Axes.plot().

class matplotlib.pyplot.Axes
plot(*args, **kwargs)

Рисует линии и/или точки (маркеры) на координатной плоскости.

Параметры:
  • args – аргумент переменной длины, содержащий набор точек для осей OX и OY, а также произвольный текста и параметры графика;

  • kwargs – стиль и свойства линий.

Результат:

список добавленных на координатную плоскость линий;

Тип результата:

Line2D.

Стиль и свойства линии могут быть заданы как через позиционные аргументы args, так и ключевые - kwargs:

В случае, когда значения являются датой, удобнее использовать метод Axes.plot_date().

12.1.4.1.1. Стили линий

Линии (класс Line2D) графика могут иметь различные стили: тип, толщину, цвет, форму и т.д.

class matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None, markerfacecoloralt='none', fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs)

Параметр kwargs при создании графика может содержать соответствующие свойства линии.

Некоторые атрибуты линии:

class matplotlib.lines.Line2D
axes

Координатная плоскость, которой принадлежит линия.

color

Цвет линии, который может быть задан:

  • именем "green";

  • аббревиатурой "g";

  • в шестандцатеричном формате "#00FF00";

  • RGB (0, 1, 0) или RGBA (0, 1, 0, 1) кортежем;

  • оттенком серого в виде строки "0.8".

Если не указывать цвет, matplotlib выберет его самостоятельно.

label

Наименование линии (используется, в частности, для легенды).

linestyle

Стиль линии:

  • "solid": сплошная;

  • "dashed": пунктирная;

  • "dotted": точечная;

  • "dashdot": точечно-пунктирная;

  • и др.

linewidth

Толщина линии (вещественное число).

marker

Тип маркера для точки графика (по умолчанию отсутствуют), например:

  • ".": точка;

  • "+": плюс;

  • "o": окружность;

  • "*": звезда;

  • и др.

Полный список маркеров указан в документации: matplotlib.markers.

Цвета маркеров определяются атрибутами markeredgecolor, markeredgewidth, markerfacecolor, markerfacecoloralt.

markersize

Размер маркера.

В Листинге 12.1.4 и на Рисунке 12.1.6 приведен пример создания графика с линиями различного стиля.

Листинг 12.1.4 - Различные стили линий графика | скачать
 1import numpy as np
 2import matplotlib
 3import matplotlib.pyplot as plt
 4
 5if __name__ == "__main__":
 6
 7    fig, ax = plt.subplots()
 8    fig.canvas.set_window_title("Графики функций")
 9
10    # Настройки диаграммы и осей
11    ax.set_title("Графики функций: различные стили")
12    ax.grid(True)
13
14    ax.set_xlim(-10, 10)
15    ax.set_ylim(-10, 10)
16    ax.spines["left"].set_position("center")
17    ax.spines["bottom"].set_position("center")
18    ax.spines['top'].set_visible(False)
19    ax.spines['right'].set_visible(False)
20    ax.set_aspect("equal")
21
22    # Графики различного стиля
23    x = np.arange(-10, 10, 0.5)  # x - массив np.array
24    ax.plot(x, abs(2 - abs(x)), label="Желтая сплошная линия",
25            color="yellow", linewidth=3)
26    ax.plot(x, -x - 5, label="Фиолетовая пунктирная линия",
27            color="#D490CC", linewidth=3, linestyle="dashed")
28    ax.plot(x, x - 8, label="Линия с точками-маркерами *",
29            marker="*")
30    ax.plot([-6] * len(x), x, label="Точки-маркеры o",
31            linestyle="none", marker="o", markersize=3)
32
33    # Легенда
34    ax.legend(loc="best")
35
36    plt.show()
_images/12_01_06.png

Рисунок 12.1.6 - Различные стили линий графика

12.1.4.2. Круговая диаграмма

Круговая диаграмма отображает размер элементов одного ряда данных относительно суммы элементов, а точки данных на круговой диаграмме выводятся как проценты от всего круга.

Круговая диаграмма может быть нарисована с использованием метода Axes.pie().

class matplotlib.lines.Axes
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False)

Рисует круговую диаграмму для значений x, где доля круга определяется, как x/sum(x).

По умолчанию доли (сектора) рисуются против часовой стрелки относительно оси OX.

Некоторые параметры:

Параметры:
  • x – набор значений (обязательный параметр);

  • colors – набор значений цветов секторов;

  • labels – набор подписей для секторов;

  • autopct – форматная строка или функция для отображения значения доли на секторах круга;

  • shadow (bool) – рисует тень, если True;

  • radius – радиус круга (по умолчанию: 1).

В Листинге 12.1.5 и на Рисунке 12.1.6 приведен пример создания круговой диаграммы.

Листинг 12.1.5 - Круговая диаграмма | скачать
 1import matplotlib
 2import matplotlib.pyplot as plt
 3
 4if __name__ == "__main__":
 5
 6    fig, ax = plt.subplots()
 7    fig.canvas.set_window_title("Фактическое исполнение бюджета Москвы в 2015 году")
 8
 9    # Настройки диаграммы и осей
10    ax.set_title("Фактическое исполнение бюджета Москвы в 2015 году")
11    ax.set_xlabel("https://data.mos.ru/opendata/"
12                  "7710152113-struktura-dohodov-byudjeta/row/37352740")
13
14    # https://data.mos.ru/opendata/7710152113-struktura-dohodov-byudjeta/row/37352740
15    data = [
16        ["Налог на прибыль", 484.7],
17        ["Налог на доходы физических лиц", 691.6],
18        ["Прочие налоговые доходы", 221.2],
19        ["Арендные платежи", 59.4],
20        ["Доходы от продажи имущества", 26.7],
21        ["Безвозмездные поступления", 75.5]
22    ]
23    values = [x[1] for x in data]
24    labels = [x[0] for x in data]
25
26    ax.pie(values, labels=labels, autopct="%.1f%%", radius=1.2)
27    ax.set_aspect("equal")
28
29    plt.show()
_images/12_01_07.png

Рисунок 12.1.7 - Круговая диаграмма

12.1.4.3. Столбчатая (линейчатая) диаграмма

Столбчатые диаграммы используются для сравнения отдельных элементов. В диаграммах этого типа категории обычно располагаются на вертикальной оси, а величины - на горизонтальной.

Столбчатая диаграмма может быть нарисована с использованием методов:

class matplotlib.lines.Axes
bar(left, height, width=0.8, bottom=None, **kwargs)

Рисует столбчатую диаграмму (вертикальную).

Некоторые параметры:

Параметры:
  • left (набор числовых значений) – координата x левого края каждого прямоугольника;

  • height (набор числовых значений) – высота каждого прямоугольника;

  • width (набор числовых значений) – ширина каждого прямоугольника;

  • bottom (набор числовых значений) – координата y нижнего края каждого прямоугольника;

  • color (набор значений) – цвет каждого прямоугольника;

  • tick_label (строка или набор значений) – подпись по оси OX для каждого прямоугольника.

class matplotlib.lines.Axes
barh(bottom, width, height=0.8, left=None, **kwargs)

Рисует столбчатую диаграмму (горизонтальную).

Некоторые параметры:

Параметры:
  • bottom (набор числовых значений) – координата y каждого прямоугольника (центр);

  • width (набор числовых значений) – ширина каждого прямоугольника;

  • height (набор числовых значений) – высота каждого прямоугольника;

  • left (набор числовых значений) – координата x правого края каждого прямоугольника;

  • color (набор значений) – цвет каждого прямоугольника;

  • tick_label (строка или набор значений) – подпись по оси OY для каждого прямоугольника.

В Листинге 12.1.6 и на Рисунке 12.1.8 приведен пример создания столбчатой диаграммы.

Листинг 12.1.6 - Столбчатая диаграмма | скачать
 1import matplotlib
 2import matplotlib.pyplot as plt
 3
 4if __name__ == "__main__":
 5
 6    title = "Валовой внутренний продукт РФ: в ценах 2011г. (2011-2016 гг.)"
 7
 8    fig, (ax1, ax2) = plt.subplots(ncols=2)
 9    fig.canvas.set_window_title(title)
10    fig.suptitle(title +
11                 "\nhttp://www.gks.ru/free_doc/new_site/vvp/vvp-god/tab2a.xls")
12    # Настройки диаграммы и осей
13    ax1.set_xlabel("Год")
14    ax1.set_ylabel("В ценах 2011 г., млрд.руб.")
15    ax2.set_xlabel("В ценах 2011 г., млрд.руб.")
16    ax2.set_ylabel("Год")
17
18    # http://www.gks.ru/free_doc/new_site/vvp/vvp-god/tab2a.xls
19    data = [
20        [2011, 59698.1],
21        [2012, 61798.3],
22        [2013, 62588.9],
23        [2014, 63038.4],
24        [2015, 61249.4],
25        [2016, 61097.5]
26    ]
27    size = [x[1] for x in data]
28    nums = [x + 1 for x in range(len(size))]
29    tick_label = [x[0] for x in data]
30
31    ax1.bar(nums, size, tick_label=tick_label, width=0.5, color="#a500ff")
32    ax2.barh(nums, size, tick_label=tick_label, height=0.7, color="#ffa500")
33
34    plt.show()
_images/12_01_08.png

Рисунок 12.1.8 - Столбчатая диаграмма

12.1.4.4. Гистограмма

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

Гистограмма может быть нарисована с использованием метода Axes.hist().

class matplotlib.lines.Axes
matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)[source]

Рисует гистограмму по данным x.

Некоторые параметры:

param x:

входные данные;

type x:

набор числовых значений (одномерный или двумерный)

param bins:

количество интервалов разбиения;

type bins:

int или набор данных

param str align:

выравнивание прямоугольника гистограммы:

  • "left" (по левому краю);

  • "mid" (по центру - по умолчанию);

  • "right" (по правому краю).

param str orientation:

ориентация гистограммы:

  • "horizontal" (горизонтально);

  • "mid" (вертикально - по умолчанию).

param color:

набор значений цветов данных;

param label:

набор подписей для данных.

return:

кортеж:

  • n: массив длин прямоугольников или список таких массивов (если было передано несколько наборов данных);

  • bins: массив - границы прямоугольников;

  • patches: набор вложенных массивов - индивидуальных параметров прямоугольников в случае построения нескольких наборов данных.

В Листинге 12.1.7 и на Рисунке 12.1.9 приведен пример создания гистограммы.

Листинг 12.1.7 - Гистограмма | скачать
 1import matplotlib
 2import matplotlib.pyplot as plt
 3
 4if __name__ == "__main__":
 5
 6    title = "Распределение сумм кредитов"
 7
 8    fig, ax = plt.subplots()
 9    fig.canvas.set_window_title(title)
10
11    # Настройки диаграммы и осей
12    ax.set_title(title)
13    ax.set_xlabel("Сумма")
14    ax.set_ylabel("Количество")
15
16    # Суммы кредитов, взятых в банке
17    data = [40000, 120000, 90000, 160000, 290000, 250000,
18            90000, 260000, 170000, 11000, 500000, 250000]
19
20    bins_to_be = 3  # Количество интервалов разбиения
21    n, bins, patches = ax.hist(data, bins=bins_to_be,
22                               color="brown", edgecolor="black")
23
24    # Вывод итоговых данных в легенду
25    res = ""
26    for i in range(bins_to_be):
27        res += "Группа №{}, {:.0f} чел., от {:.2f} руб.\n". \
28               format(i+1, n[i], bins[i])
29
30    ax.legend([res.strip()])
31
32    plt.show()
_images/12_01_09.png

Рисунок 12.1.9 - Гистограмма

12.1.5. Какой тип диаграммы выбрать?

Выбор правильного типа диаграммы - залог успешной визуализации данных. На Рисунках 12.1.10 и 12.1.11 приведены краткие и расширенные критерии выбора.

_images/12_01_10.png

Рисунок 12.1.10 - Какой тип диаграммы выбрать? [11]

_images/12_01_11.png

Рисунок 12.1.11 - Как выбрать диаграмму?! [12]

12.1.6. Дополнительные возможности

В matplotlib 1.3 появилась возможность применения эффекта рисования от руки, чтобы изображение выглядело в стиле комиксов с сайта xkcd.com, для чего перед отрисовкой необходимо выполнить команду pyplot.xkcd() (Рисункок 12.1.12).

_images/12_01_12.png

Рисунок 12.1.12 - Изображение в стиле комикса xkcd

В целом библиотека matplotlib обладает существенно большими возможностями, чем рассмотренные, поэтому настоятельно рекомендуется ознакомиться с официальной документацией и изучить ее прочие возможности.