Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
8
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

178      Глава 8. Визуализация

Доступ к объектам Figure и Axes осуществляется через функцию matplotlib. pyplot.subplots(). При вызове без аргументов эта функция возвращает экземпляр Figure и один экземпляр Axes, связанный с Figure. Добавляя аргументы к функции subplots(), можно создать экземпляр Figure и несколько Axes, то есть, другими словами, создать рисунок с несколькими графиками. Например, вызов subplots(2,2)создает рисунок с четырьмя графиками, расположенными в два ряда по два. Каждый график представлен одним объектом Axes.

ПРИМЕЧАНИЕ

Более подробную информацию об использовании subplots() см. в докумен-

тации Matplotlib1.

Создание гистограммы с помощью subplots()

В следующем скрипте мы используем subplots() для создания объекта Figure и одного объекта Axes. Затем обработаем объекты для создания гистограммы с рис. 8.5, отображающей распределение окладов сотрудников. Кроме объектов Figure и Axes, мы будем работать с модулем Matplotlib matplotlib.ticker для форматирования отметок на оси x, а также с NumPy для определения размера шага гистограммы ($50).

# импортирование модулей import numpy as np

from matplotlib import pyplot as plt import matplotlib.ticker as ticker

# данные для графика

salaries = [1215, 1221, 1263, 1267, 1271, 1274, 1275, 1318, 1320, 1324, 1324, 1326, 1337, 1346, 1354, 1355, 1364, 1367, 1372, 1375, 1376, 1378, 1378, 1410, 1415, 1415, 1418, 1420, 1422, 1426, 1430, 1434, 1437, 1451, 1454, 1467, 1470, 1473, 1477, 1479, 1480, 1514, 1516, 1522, 1529, 1544, 1547, 1554, 1562, 1584, 1595, 1616, 1626, 1717]

# подготовка гистограммы

fig, ax = plt.subplots()

fig.set_size_inches(5.6, 4.2)

ax.hist(salaries, bins=np.arange(1100, 1900, 50), edgecolor='black', linewidth=1.2)

formatter = ticker.FormatStrFormatter('$%1.0f')ax.xaxis.set_major_formatter(formatter)

plt.title('Ежемесячные оклады сотрудников отдела продаж') plt.xlabel('Оклад (интервал — $50)')

1 https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.subplots.html

Создание гистограммы с помощью subplots()      179

plt.ylabel('Частота')

# вывод гистограммы на экран plt.show()

Начинаем с объявления списка salaries с данными об окладе, которые хотим визуализировать . Затем вызываем функцию subplots() без параметров , тем самым задаем создание рисунка с одним графиком. Функция возвращает кортеж, содержащий два объекта: fig и ax, представляющие собой рисунок и график соответственно.

Теперь, когда у нас есть экземпляры Figure и Axes, можем приступить к их настройке. В первую очередь вызываем метод set_size_inches() объекта Figure для изменения размера всего рисунка . Затем — метод hist() объекта Axes для построения гистограммы . Передаем методу список salaries в качестве входных данных для гистограммы, а также массив NumPy с точками оси x для определения интервалов. Функция NumPy arange()создает массив равномерно расположенных значений в заданном интервале (в данном случае с шагом 50 от 1100 до 1900). Параметр edgecolor метода hist() нужен для отображения интервальных границ (bins) в виде линий черного цвета, а параметр linewidth позволяет определить ширину этих границ.

Далее используем функцию FormatStrFormatter()из модуля matplotlib.ticker для создания средства форматирования, которое будет добавлять знак доллара к каждой метке оси x . Применяем средство форматирования к меткам оси x с помощью метода set_major_formatter()объекта ax.xaxis . Наконец, задаем общие настройки графика, такие как его заголовок и метки главной оси, через интерфейс matplotlib.pyplot и выводим график на экран.

Частотное распределение на круговой диаграмме

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

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

180      Глава 8. Визуализация

import numpy as np

count, labels = np.histogram(salaries, bins=np.arange(1100, 1900, 50))

Здесь мы вызываем функцию histogram(), передавая ей тот же список salaries, который создали ранее, и снова используем функцию NumPy arange() для создания равномерно распределенных областей. Вызов histogram() возвращает два массива NumPy: count и labels.

Массив count представляет собой количество сотрудников с окладом в каждом интервале и выглядит следующим образом:

[0,

0,

2,

5,

7,

9,

10,

8,

6,

4,

2,

0,

1,

0,

0]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А массив labels содержит границы интервалов областей:

[1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850]

Далее необходимо объединить соседние элементы массива labels, превратив их в метки для частей круговой диаграммы. Так, соседние элементы 1100 и 1150 должны стать единой меткой, приведенной к виду '$1100-1150'. Используем следующее списковое включение:

labels = ['$'+str(labels[i])+'-'+str(labels[i+1]) for i, _ in enumerate(labels[1:])]

Полученный в результате список labels будет выглядеть так:

['$1100-1150', '$1150-1200', '$1200-1250', '$1250-1300', '$1300-1350', '$1350-1400', '$1400-1450', '$1450-1500', '$1500-1550', '$1550-1600', '$1600-1650', '$1650-1700', '$1700-1750', '$1750-1800', '$1800-1850']

Каждый элемент в labels соответствует элементу в массиве count с тем же индексом. Однако, взглянув на массив count, можно заметить проблему: в некоторых интервалах количество окладов равно 0. Вряд ли стоит включать эти пустые интервалы в круговую диаграмму. Чтобы исключить их, необходимо сформировать список индексов, соответствующих непустым интервалам в массиве count:

non_zero_pos = [i for i, x in enumerate(count) if x != 0]

Создание гистограммы с помощью subplots()      181

Теперь можно использовать non_zero_pos для фильтрации count и labels, исключая те элементы, которые представляют собой пустые интервалы:

labels = [e for i, e in enumerate(labels) if i in non_zero_pos] count = [e for i, e in enumerate(count) if i in non_zero_pos]

Остается только создать и отобразить круговую диаграмму с помощью интерфейса matplotlib.pyplot и plt.pie():

from matplotlib import pyplot as plt plt.pie(count, labels=labels, autopct='%1.1f%%')

plt.title('Ежемесячные оклады сотрудников отдела продаж') plt.show()

На рис. 8.7 показан результат выполнения кода.

Е а а а

 

 

 

$1300–1350

 

$1350–1400

 

 

 

 

 

16.7%

13.0%

 

 

 

 

$1250–1300

 

 

 

 

 

 

 

9.3%

 

 

 

 

3.7%

$1200–1250

$1400–1450

18.5%

 

 

 

1.9%

$1700–1750

 

 

 

 

 

 

3.7%

$1600–1650

 

 

 

 

 

 

 

7.4%

 

 

14.8%

11.1%

$1550–1600

 

 

 

 

 

$1450–1500

 

 

$1500–1550

 

 

 

Рис. 8.7. Круговая диаграмма с распределением частотности

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