12.1. Теория¶
Текст является одним из лучших способов передачи информации, однако, в ряде случаев, как гласит известная поговорка, «лучше один раз увидеть, чем сто раз услышать».
В Python визуализация данных легко осуществляется с использованием сторонних пакетов, среди которых одним из наиболее известных является библиотека matplotlib.
12.1.1. Описание и установка¶
Matplotlib распространяется на условиях BSD-подобной лицензии. Библиотека поддерживает двумерную (2D) и трехмерную (3D) графику, а также анимированные рисунки.
Создаваемые изображения могут быть использованы в мультимедийных приложениях, научных проектах, а также различных документах, публикациях и веб-приложениях. Исторически библиотека формировалась под влиянием математического пакета Matlab, но являлась и является независимым от него проектом. Построенная на принципах ООП, библиотека также имеет процедурный интерфейс pylab, который предоставляет аналоги команд Matlab.
Последняя стабильная версия библиотеки поддерживает Python 2.6 и выше. В курсе рассматривается matplotlib версии 2+.
Пакет поддерживает многие виды диаграмм:
графики;
диаграммы разброса;
столбчатые диаграммы и гистограммы;
круговые диаграммы;
ствол-лист диаграммы;
контурные графики;
поля градиентов;
спектральные диаграммы
и др.
При построении возможно указать оси координат, сетку, добавить аннотации, использовать логарифмическую шкалу или полярные координаты. Созданные изображения могут быть легко сохранены, в частности, в популярные форматы (JPEG, PNG и др.).
Пример изображений приведен на Рисунке 12.1.1.
Рисунок 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 все объекты организованы в единую иерархию:
На вершине иерархии находится конечный автомат (модель, число возможных внутренних состояний которой конечно), предоставляемый модулем
matplotlib.pyplot. На данном уровне все функции, используемые для рисования диаграмм (линии, рисунки, текст и т.д.) применяются к текущему изображению.На уровне ниже располагается объектно-ориентированный интерфейс, используемый для создания изображений, где объектами являются само изображение, оси координат, графические примитивы и т.д.
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 представлены основные элементы изображения.
Рисунок 12.1.2 - Основные элементы изображения в matplotlib¶
Изображение может содержать несколько диаграмм, каждая из которых будет представлять собой Рисунок 12.1.2.
Все элементы изображения унаследованы от класса Artists (модуль artist) и делятся на 2 типа:
Примитивы:
Контейнеры:
12.1.3. Создание изображений¶
12.1.3.1. Построение простой диаграммы¶
Типичный ход построения изображения, как правило, включает следующие шаги:
Создать объект
Figure.Используя объект
Figure, добавить координатную плоскостьAxes(одну или несколько).Используя методы
Axes, добавить на изображение графические примитивы.Отобразить и/или сохранить изображение.
Пример построения изображения приведен в Листинге 12.1.1.
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“);
- Результат:
кортеж:
Для вывода полученного изображения на экран используется функция pyplot.show().
- matplotlib.pyplot.show(*args, **kw)¶
Выводит изображение на экран в отдельном окне (Рисунок 12.1.3).
Рисунок 12.1.3 - Выполнение кода из Листинга 12.1.1.¶
Кроме диаграммы графическое окно содержит специальные функциональные кнопки (интерактивную навигацию, пронумерована на Рисунке 12.1.3), их назначение и возможности приведены в Таблице 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 может иметь:
заголовок (метод Axes.title());
подписи у осей (методы Axes.set_xlabel() и Axes.set_ylabel()).
- matplotlib.pyplot.set_title(label, fontdict=None, loc='center', **kwargs)¶
Установить заголовок диаграммы.
Обязательный параметр:
12.1.3.3. Координатная сетка и масштабирование¶
Координатная плоскость поддерживает настройку:
координатной сетки (метод Axes.grid());
соотношения сторон (метод Axes.set_aspect());
пределов осей (методы Axes.set_xlim() и Axes.set_ylim());
положения линий осей (поле Axes.spines и метод Spines.set_position()).
- 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.
- Тип результата:
- set_ylim(bottom=None, top=None, emit=True, auto=False, **kw)¶
Установить пределы значений
[bottom; top]по оси OY.- Результат:
кортеж - новые пределы по оси OY.
- Тип результата:
- spines¶
Словарь - линии осей координат (класс Spines):
"left"(левая);"bottom"(нижняя);"right"(правая);"top"(верхняя).
Для изменения позиции конкретной линии оси координат используется метод Spines.set_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. Текст и аннотациии¶
На диаграмму также имеется возможность добавить:
произвольный текст (метод Axes.text());
аннотацию (метод Axes.annotate()).
Текст в 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).Некоторые параметры:
- Параметры:
В Листинге 12.1.2 и на Рисунке 12.1.4 приведен пример использования ряда функций для построения диаграммы.
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()
Рисунок 12.1.4 - Заголовки, подписи и другие элементы графика в matplotlib¶
12.1.3.6. Несколько диаграмм в изображении¶
В ряде случаев удобно иметь несколько диаграмм в рамках одного изображения. matplotlib позволяет это сделать, используя функцию matplotlib.pyplot.subplots(), указав параметры разбиения изображения (Листинге 12.1.3, Рисунок 12.1.5).
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()
Рисунок 12.1.5 - Несколько диаграмм в изображении в matplotlib¶
Доступ к любой из координатных плоскостей можно получить сохранив их при вызове функции matplotlib.pyplot.subplots() или через функцию Figure.get_axes().
12.1.4. Основные типы диаграмм¶
Класс matplotlib.axes.Axes содержит множество методов для рисования диаграмм различного типа (Таблица 12.1.2).
Тип |
Метод |
Пример |
|---|---|---|
График |
|
|
Круговая диаграмма |
|
|
Столбчатая (линейчатая) диаграмма |
|
|
Гистограмма |
|
Диаграммы можно комбинировать, вызывая последовательно разные методы: например, на одной диаграмме может быть нарисована столбчатая диаграмма и график одновременно.
12.1.4.1. График¶
График (в т.ч. точечная диаграмма) является одним из самых простых способов отображения зависимости в графическом виде и может быть нарисован с использованием метода Axes.plot().
- class matplotlib.pyplot.Axes¶
- plot(*args, **kwargs)¶
Рисует линии и/или точки (маркеры) на координатной плоскости.
- Параметры:
args – аргумент переменной длины, содержащий набор точек для осей OX и OY, а также произвольный текста и параметры графика;
kwargs – стиль и свойства линий.
- Результат:
список добавленных на координатную плоскость линий;
- Тип результата:
Стиль и свойства линии могут быть заданы как через позиционные аргументы
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 приведен пример создания графика с линиями различного стиля.
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()
Рисунок 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 приведен пример создания круговой диаграммы.
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()
Рисунок 12.1.7 - Круговая диаграмма¶
12.1.4.3. Столбчатая (линейчатая) диаграмма¶
Столбчатые диаграммы используются для сравнения отдельных элементов. В диаграммах этого типа категории обычно располагаются на вертикальной оси, а величины - на горизонтальной.
Столбчатая диаграмма может быть нарисована с использованием методов:
Axes.bar() (вертикальная);
Axes.barh() (горизонтальная).
- 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 приведен пример создания столбчатой диаграммы.
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()
Рисунок 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 приведен пример создания гистограммы.
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()
Рисунок 12.1.9 - Гистограмма¶
12.1.5. Какой тип диаграммы выбрать?¶
Выбор правильного типа диаграммы - залог успешной визуализации данных. На Рисунках 12.1.10 и 12.1.11 приведены краткие и расширенные критерии выбора.
12.1.6. Дополнительные возможности¶
В matplotlib 1.3 появилась возможность применения эффекта рисования от руки, чтобы изображение выглядело в стиле комиксов с сайта xkcd.com, для чего перед отрисовкой необходимо выполнить команду pyplot.xkcd() (Рисункок 12.1.12).
Рисунок 12.1.12 - Изображение в стиле комикса xkcd¶
В целом библиотека matplotlib обладает существенно большими возможностями, чем рассмотренные, поэтому настоятельно рекомендуется ознакомиться с официальной документацией и изучить ее прочие возможности.



