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:

pip3 install matplotlib
pip3 install matplotlib --upgrade

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

Примечание

Пользователи ОС Windows могут столкнуться с ошибкой при установке пакета (в необходимом пакете numpy). В этом случае предварительно:

или

  • на странице Unofficial Windows Binaries for Python Extension Packages загрузите отдельно пакет numpy (например, numpy-1.12.0+mkl-cp35-cp35m-win_amd64.whl) и выполните установку через pip:

    pip3 install numpy-1.12.0+mkl-cp35-cp35m-win_amd64.whl
    

После этого повторите установку пакета matplotlib.

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

>>> import matplotlib
>>> matplotlib.__version__
'2.0.0'

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

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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1) Подключение необходимых библиотек
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

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

    # 2) Формирование данных и построение диаграммы
    x = np.arange(-8, 3, 0.1)  # x - массив np.array
    y = abs(x**2 + 4*x - 5)

    # Вызов диаграммы нужного типа
    fig, ax = plt.subplots()
    fig.canvas.set_window_title("Мое первое изображение")  # Заголовок окна

    ax.grid(True)  # Отображение сетки на координатной плоскости
    ax.plot(x, y, 'r', linewidth=3)  # График красного цвета

    # 3) Вывод результата
    plt.savefig("my_image.png")  # Сохранение изображения
    # или
    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 | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    x = np.arange(-8, 3, 0.1)  # x - массив np.array
    y1 = abs(x**2 + 4*x - 5)
    y2 = [9] * len(x)

    fig, ax = plt.subplots()
    fig.canvas.set_window_title("Графики функций")

    # Настройки диаграммы и осей
    ax.set_title("Графики функций: экстремум")
    ax.set_xlabel("Ось абсцисс")
    ax.set_ylabel("Ось ординат")
    ax.grid(True)

    # 2 графика
    ax.plot(x, y1, 'r', linewidth=3, label="Парабола")
    ax.plot(x, y2, label="Линия")

    # Аннотации и текст
    ax.annotate(r"Экстремум функции = $\frac{-b}{2a} = \frac{-4}{2} = -2$",
                xy=(-2, 9), xytext=(-4.8, 15.5),
                arrowprops=dict(facecolor="black", shrink=0.05))
    ax.text(-7, 24.5, "На диаграмме 2 графика:\nпарабола и линия экстремума")

    # Легенда
    ax.legend()

    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 | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    x = np.arange(-8, 3, 0.1)  # x - массив np.array
    y1 = abs(x**2 + 4*x - 5)
    y2 = [9] * len(x)

    fig, (ax1, ax2) = plt.subplots(ncols=2)  # 2 диаграммы по горизонтали
    fig.canvas.set_window_title("Графики функций")

    # 1) 1-й график

    # Настройки диаграммы и осей
    ax1.set_title("Графики функций: экстремум")
    ax1.set_xlabel("Ось абсцисс")
    ax1.set_ylabel("Ось ординат")
    ax1.grid(True)

    # 2 графика
    ax1.plot(x, y1, 'r', linewidth=3, label="Парабола")
    ax1.plot(x, y2, label="Линия")

    # Аннотации и текст
    ax1.annotate(r"Экстремум функции = $\frac{-b}{2a} = \frac{-4}{2} = -2$",
                xy=(-2, 9), xytext=(-4.8, 15.5),
                arrowprops=dict(facecolor="black", shrink=0.05))
    ax1.text(-7, 24.5, "На диаграмме 2 графика:\nпарабола и линия экстремума")

    # Легенда
    ax1.legend()

    # 2) 2-й график

    # Настройки диаграммы и осей
    ax2.set_title("Графики функций: корни уравнения")

    # 3 графика
    y2 = list(range(-20, 21))
    x2 = [-5] * len(y2)
    x3 = [1] * len(y2)

    ax2.plot(x, y1, linewidth=3, label="Парабола")
    ax2.plot(x2, y2, label="Корень 1")
    ax2.plot(x3, y2, label="Корень 2")

    # Аннотации и текст
    ax2.text(-2, 27, "На диаграмме 3 графика:\nпарабола и корни",
             horizontalalignment="center")
    ax2.annotate("Корень 1 = -5", xy=(-5, -1.5), xytext=(-10, -5),
                 arrowprops=dict(
                    facecolor="black", connectionstyle="angle3",
                    arrowstyle="->"
                ))
    ax2.annotate("Корень 2 = 1", xy=(1, -1.5), xytext=(2, -8),
                 arrowprops=dict(
                    facecolor="black", connectionstyle="angle3",
                    arrowstyle="->"
                ))

    ax2.set_xlim(-10, 10)
    ax2.set_ylim(-10, 10)
    ax2.spines["left"].set_position("center")
    ax2.spines["bottom"].set_position("center")
    ax2.spines['top'].set_visible(False)
    ax2.spines['right'].set_visible(False)

    # Легенда
    ax2.legend(loc="best")

    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 - Различные стили линий графика | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    fig, ax = plt.subplots()
    fig.canvas.set_window_title("Графики функций")

    # Настройки диаграммы и осей
    ax.set_title("Графики функций: различные стили")
    ax.grid(True)

    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    ax.spines["left"].set_position("center")
    ax.spines["bottom"].set_position("center")
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.set_aspect("equal")

    # Графики различного стиля
    x = np.arange(-10, 10, 0.5)  # x - массив np.array
    ax.plot(x, abs(2 - abs(x)), label="Желтая сплошная линия",
            color="yellow", linewidth=3)
    ax.plot(x, -x - 5, label="Фиолетовая пунктирная линия",
            color="#D490CC", linewidth=3, linestyle="dashed")
    ax.plot(x, x - 8, label="Линия с точками-маркерами *",
            marker="*")
    ax.plot([-6] * len(x), x, label="Точки-маркеры o",
            linestyle="none", marker="o", markersize=3)

    # Легенда
    ax.legend(loc="best")

    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 - Круговая диаграмма | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    fig, ax = plt.subplots()
    fig.canvas.set_window_title("Фактическое исполнение бюджета Москвы в 2015 году")

    # Настройки диаграммы и осей
    ax.set_title("Фактическое исполнение бюджета Москвы в 2015 году")
    ax.set_xlabel("https://data.mos.ru/opendata/"
                  "7710152113-struktura-dohodov-byudjeta/row/37352740")

    # https://data.mos.ru/opendata/7710152113-struktura-dohodov-byudjeta/row/37352740
    data = [
        ["Налог на прибыль", 484.7],
        ["Налог на доходы физических лиц", 691.6],
        ["Прочие налоговые доходы", 221.2],
        ["Арендные платежи", 59.4],
        ["Доходы от продажи имущества", 26.7],
        ["Безвозмездные поступления", 75.5]
    ]
    values = [x[1] for x in data]
    labels = [x[0] for x in data]

    ax.pie(values, labels=labels, autopct="%.1f%%", radius=1.2)
    ax.set_aspect("equal")

    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 - Столбчатая диаграмма | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    title = "Валовой внутренний продукт РФ: в ценах 2011г. (2011-2016 гг.)"

    fig, (ax1, ax2) = plt.subplots(ncols=2)
    fig.canvas.set_window_title(title)
    fig.suptitle(title +
                 "\nhttp://www.gks.ru/free_doc/new_site/vvp/vvp-god/tab2a.xls")
    # Настройки диаграммы и осей
    ax1.set_xlabel("Год")
    ax1.set_ylabel("В ценах 2011 г., млрд.руб.")
    ax2.set_xlabel("В ценах 2011 г., млрд.руб.")
    ax2.set_ylabel("Год")

    # http://www.gks.ru/free_doc/new_site/vvp/vvp-god/tab2a.xls
    data = [
        [2011, 59698.1],
        [2012, 61798.3],
        [2013, 62588.9],
        [2014, 63038.4],
        [2015, 61249.4],
        [2016, 61097.5]
    ]
    size = [x[1] for x in data]
    nums = [x + 1 for x in range(len(size))]
    tick_label = [x[0] for x in data]

    ax1.bar(nums, size, tick_label=tick_label, width=0.5, color="#a500ff")
    ax2.barh(nums, size, tick_label=tick_label, height=0.7, color="#ffa500")

    plt.show()
_images/12_01_08.png

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

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

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

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

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

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

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

Параметры:
  • x (набор числовых значений (одномерный или двумерный)) – входные данные;
  • bins (int или набор данных) – количество интервалов разбиения;
  • align (str) –

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

    • "left" (по левому краю);
    • "mid" (по центру - по умолчанию);
    • "right" (по правому краю).
  • orientation (str) –

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

    • "horizontal" (горизонтально);
    • "mid" (вертикально - по умолчанию).
  • color – набор значений цветов данных;
  • label – набор подписей для данных.
Результат:

кортеж:

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

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

Листинг 12.1.7 - Гистограмма | скачать
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import matplotlib
import matplotlib.pyplot as plt

if __name__ == "__main__":

    title = "Распределение сумм кредитов"

    fig, ax = plt.subplots()
    fig.canvas.set_window_title(title)

    # Настройки диаграммы и осей
    ax.set_title(title)
    ax.set_xlabel("Сумма")
    ax.set_ylabel("Количество")

    # Суммы кредитов, взятых в банке
    data = [40000, 120000, 90000, 160000, 290000, 250000,
            90000, 260000, 170000, 11000, 500000, 250000]

    bins_to_be = 3  # Количество интервалов разбиения
    n, bins, patches = ax.hist(data, bins=bins_to_be,
                               color="brown", edgecolor="black")

    # Вывод итоговых данных в легенду
    res = ""
    for i in range(bins_to_be):
        res += "Группа №{}, {:.0f} чел., от {:.2f} руб.\n". \
               format(i+1, n[i], bins[i])

    ax.legend([res.strip()])

    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 обладает существенно большими возможностями, чем рассмотренные, поэтому настоятельно рекомендуется ознакомиться с официальной документацией и изучить ее прочие возможности.


[1]Sebesta, W.S Concepts of Programming languages. 10E; ISBN 978-0133943023.
[2]Python - официальный сайт. URL: https://www.python.org/.
[3]Python - FAQ. URL: https://docs.python.org/3/faq/programming.html.
[4]Саммерфилд М. Программирование на Python 3. Подробное руководство. — М.: Символ-Плюс, 2009. — 608 с.: ISBN: 978-5-93286-161-5.
[5]Лучано Рамальо. Python. К вершинам мастерства. — М.: ДМК Пресс , 2016. — 768 с.: ISBN: 978-5-97060-384-0, 978-1-491-94600-8.
[6]График. URL: https://upload.wikimedia.org/wikipedia/commons/8/88/I1_Line_RSG-Diagram.PNG
[7]Круговая диаграмма. URL: https://upload.wikimedia.org/wikipedia/commons/2/24/I4_Circ_feren_diagram.PNG
[8]Столбчатая (линейчатая) диаграмма. URL: https://upload.wikimedia.org/wikipedia/commons/8/81/I3_Histogram.PNG
[9]Гистограмма. URL: https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Histogram_example.svg/959px-Histogram_example.svg.png
[10]Screenshot of matplotlib plots and code. URL: https://upload.wikimedia.org/wikipedia/commons/c/ca/Mpl_screenshot_figures_and_code.png.
[11]Выбор типа диаграммы. URL: http://www.plam.ru/bislit/govori_na_jazyke_diagramm_posobie_po_vizualnym_kommunikacijam/p3.php.
[12]Как выбрать диаграмму?! URL: http://www.fdfgroup.ru/?id=279.