Время прочтения: 5 мин.
Для визуализации данных в Python представлен ряд весьма популярных библиотек, о которых не раз упоминалось на сайте NewTechAudit – это seaborn, matplotlib, plotly. И есть еще одна библиотека, которая чаще всего используется для построения Treemap (древовидной карты) – библиотека squarify, о работе которой я расскажу в этом материале на примере небольших наборов данных.
Надо отметить, что первую Treemap, основанную на алгоритме «квадратизации», создал в 1999 году Мартин Ваттенберг (Martin M. Wattenberg, профессор Школы инженерии и прикладных наук Гарвардского университета) для визуализации данных о большом количестве компаний, присутствующих на фондовом рынке США.
Treemap отображает иерархические данные в виде набора вложенных визуализаций на основе прямоугольников. Этот способ визуализации приемлем, когда набор данных структурирован в иерархическом порядке с древовидной структурой: с корнями, ветвями и узлами, что позволяет эффективно отображать информацию о значимом объеме данных в ограниченном пространстве.
Библиотеку squarify рекомендовано использовать в следующих случаях:
- при работе со сложными иерархическими наборами данными, когда, например, гистограмма не представляет эффективную визуализацию;
- для визуализации пропорций между частями данных и целым, обозначив их метками;
- для отображения атрибутов с использованием размера и цветового кодирования;
- для визуализации шаблона распределения показателя по каждому уровню категорий в иерархии данных;
Начнем с установки библиотеки.
pip install squarify
Tremmap-диаграмма со списком цветов
Создадим treemap-диаграмму для списка значений данных с использованием соответствующего списка цветов. Причем, длина списка цветов (не в нашем случае) может не совпадать с длиной данных, и в таком случае цвета на диаграмме повторялись бы.
Метод plot построит квадрат размером 100×100.
# treemap со списком цветов
data_value=[500, 600, 320, 790, 800, 960]
clrs=['blue','green','black','grey','yellow','violet']
squarify.plot(sizes= data_value, color=clrs)
Вот результат (по умолчанию диапазон диаграммы 100 х 100):
Tremmap-диаграмма с цветовой палитрой
Теперь, используя те же данные, импортируем модуль seaborn, для выбора цветовой палитры. Аргумент alpha – для применения прозрачности диаграммы – число в диапазоне от 0 до 1 (чем ближе к 0, тем больше прозрачность).
import seaborn as sb
# treemap-диаграмма с цветовой палитрой и
squarify.plot(sizes=data_value, color=sb.color_palette('Spectral',len(data_value))
,alpha=0.7)
# не используем в выводе отображение осей X,Y
plt.axis('off')
Результат ниже:
Масштабирование Treemap-диаграммы
Масштаб используется для изменения диапазона диаграммы. Используя аргументы norm_x и norm_y можно масштабировать данные по оси X и Y соответственно.
# масштабируем treemap-диаграмму
data_v = [300, 50, 70, 3000]
clrs = ['blue','yellow','green','red']
squarify.plot(sizes=data_v, norm_x=1000, norm_y=10, color=clrs)
plt.axis('off')
В итоге получаем вот такую treemap-диаграмму:
Метки и пробелы
Согласитесь, что treemap-диаграмма без меток выглядит как схема из блоков, смысл которой не совсем понятен. Применение же меток поможет обозначить, что представляют собой конкретные графики. Кроме того, в следующем коде используем аргумент pad, принимающий целочисленные значения и добавляющий пробелы между элементами treemap-диаграммы для улучшения восприятия визуализации. Вот пример кода, который демонстрирует это:
# treemap-диаграмма просмотра разделов новостей
number_of_views = [205, 82, 467, 450, 92]
news = ['Политика', 'Искусство', 'Спорт', 'Медицина', 'ESG']
squarify.plot(number_of_views, label=news, pad=2, color=sb.color_palette('Spectral'))
plt.axis('off')
Сейчас результат гораздо понятнее:
Treemap-диаграмма на основе данных из файла
Давайте наконец посмотрим, как построить treemap-диаграмму на основе данных из загружаемого csv-файла, в котором содержится информация о продаже товаров. Фрагмент файла, открытого в Notepad++, представлен ниже.
# импортируем необходимые модули
import squarify
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sb
# создаем DataFrame
data = pd.read_csv('C:/Users/Projects/sale_of_goods.csv', sep = ';')
df = pd.DataFrame(data)
И затем построим treemap-диаграмму, отражающую популярность товаров у покупателей (дополнительный агрумент text_kwargs задает размер шрифта для меток):
# создаем treemap-диаграмму
plt.figure(figsize=(10, 5))
axis = squarify.plot(df['CategoryName'].value_counts(),label=df['CategoryName'].value_counts().index,
color=sb.color_palette("nipy_spectral",len(df['CategoryName'].value_counts())),
pad=1,text_kwargs={'fontsize': 14})
axis.set_title('Популярность товаров по категориям', fontsize=24)
plt.axis('off')
Treemap-диаграмма выглядит следующим образом:
Как видите, использование библиотеки squarify дает возможность визуализировать данные о видах товаров, предлагаемых клиентам, что позволяет наглядно оценить долю каждой категории в общем объеме и сделать выводы (в данной задаче) о потребительском интересе.
Treemap-диаграмма хорошо применима, когда данные имеют два основных измерения, которые необходимо визуализировать: это количественное значение, выраженное как площадь прямоугольника (значение должно быть положительным) и категориальное значение, которое выражается в виде цвета отдельных прямоугольников. Treemap-диаграмма не подходит для задач, где выполняется точное сравнение данных.
В аудиторской практике, например, мы использовали treemap чтобы оперативно представить, как распределены доходы сотрудников кампании по блокам/департаментам. Конечно, выбор способа визуализации зависит от многих факторов и условий, в этом материале показан лишь один из них. Вы можете самостоятельно поэкспериментировать с treemap на больших данных и сделать выбор в пользу этого или иного варианта построения диаграммы.
Дополнительный материал по squarify о построении treemap-диаграммы для подгрупп можно найти по ссылке https://github.com/laserson/squarify/pull/31.