12.1. Теория¶
Текст является одним из лучших способов передачи информации, однако, в ряде случаев, как гласит известная поговорка, «лучше один раз увидеть, чем сто раз услышать».
В Python визуализация данных легко осуществляется с использованием сторонних пакетов, среди которых одним из наиболее известных является библиотека matplotlib.
Содержание
12.1.1. Описание и установка¶
Matplotlib распространяется на условиях BSD-подобной лицензии. Библиотека поддерживает двумерную (2D) и трехмерную (3D) графику, а также анимированные рисунки.
Создаваемые изображения могут быть использованы в мультимедийных приложениях, научных проектах, а также различных документах, публикациях и веб-приложениях. Исторически библиотека формировалась под влиянием математического пакета Matlab, но являлась и является независимым от него проектом. Построенная на принципах ООП, библиотека также имеет процедурный интерфейс pylab, который предоставляет аналоги команд Matlab.
Последняя стабильная версия библиотеки поддерживает Python 2.6 и выше. В курсе рассматривается matplotlib версии 2+.
Пакет поддерживает многие виды диаграмм:
графики;
диаграммы разброса;
столбчатые диаграммы и гистограммы;
круговые диаграммы;
ствол-лист диаграммы;
контурные графики;
поля градиентов;
спектральные диаграммы
и др.
При построении возможно указать оси координат, сетку, добавить аннотации, использовать логарифмическую шкалу или полярные координаты. Созданные изображения могут быть легко сохранены, в частности, в популярные форматы (JPEG, PNG и др.).
Пример изображений приведен на Рисунке 12.1.1.
На странице скриншотов, а также в демонстрационной галерее библиотеки приведен обширный список примеров, включающих изображения и соответствующий код.
Установка
Как и любой пакет 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.
Все элементы изображения унаследованы от класса Artists (модуль artist) и делятся на 2 типа:
Примитивы:
Контейнеры:
12.1.3. Создание изображений¶
12.1.3.1. Построение простой диаграммы¶
Типичный ход построения изображения, как правило, включает следующие шаги:
Создать объект
Figure
.Используя объект
Figure
, добавить координатную плоскостьAxes
(одну или несколько).Используя методы
Axes
, добавить на изображение графические примитивы.Отобразить и/или сохранить изображение.
Пример построения изображения приведен в Листинге 12.1.1.
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“);
- Результат
кортеж:
Для вывода полученного изображения на экран используется функция pyplot.show().
-
matplotlib.pyplot.
show
(*args, **kw)¶ Выводит изображение на экран в отдельном окне (Рисунок 12.1.3).
Кроме диаграммы графическое окно содержит специальные функциональные кнопки (интерактивную навигацию, пронумерована на Рисунке 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 приведен пример использования ряда функций для построения диаграммы.
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()
|
12.1.3.6. Несколько диаграмм в изображении¶
В ряде случаев удобно иметь несколько диаграмм в рамках одного изображения. matplotlib позволяет это сделать, используя функцию matplotlib.pyplot.subplots()
, указав параметры разбиения изображения (Листинге 12.1.3, Рисунок 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 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()
|
Доступ к любой из координатных плоскостей можно получить сохранив их при вызове функции 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 приведен пример создания графика с линиями различного стиля.
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()
|
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 приведен пример создания круговой диаграммы.
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()
|
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 приведен пример создания столбчатой диаграммы.
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()
|
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
.Некоторые параметры:
- Параметры
x (набор числовых значений (одномерный или двумерный)) – входные данные;
bins (int или набор данных) – количество интервалов разбиения;
align (str) –
выравнивание прямоугольника гистограммы:
"left"
(по левому краю);"mid"
(по центру - по умолчанию);"right"
(по правому краю).
orientation (str) –
ориентация гистограммы:
"horizontal"
(горизонтально);"mid"
(вертикально - по умолчанию).
color – набор значений цветов данных;
label – набор подписей для данных.
- Результат
кортеж:
n: массив длин прямоугольников или список таких массивов (если было передано несколько наборов данных);
bins: массив - границы прямоугольников;
patches: набор вложенных массивов - индивидуальных параметров прямоугольников в случае построения нескольких наборов данных.
-
В Листинге 12.1.7 и на Рисунке 12.1.9 приведен пример создания гистограммы.
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()
|
12.1.5. Какой тип диаграммы выбрать?¶
Выбор правильного типа диаграммы - залог успешной визуализации данных. На Рисунках 12.1.10 и 12.1.11 приведены краткие и расширенные критерии выбора.
12.1.6. Дополнительные возможности¶
В matplotlib 1.3 появилась возможность применения эффекта рисования от руки, чтобы изображение выглядело в стиле комиксов с сайта xkcd.com, для чего перед отрисовкой необходимо выполнить команду pyplot.xkcd() (Рисункок 12.1.12).
В целом библиотека 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.