Почему? Пирог может быть вкусным, но круговые диаграммы ужасны.

Сценарий

Бизнес-группа хотела увидеть расходы с разбивкой по категориям. Проблема? В данных более 20 категорий. Также решение должно было работать в рамках Power BI и Power BI Service. Это означает, что нужно было использовать либо встроенные визуализации, либо визуализацию, созданную с помощью «Python Visualization».

Функциональность визуализации Python в Power BI великолепна, хотя при использовании службы Power BI она ограничена несколькими пакетами (см. Их список здесь).

Создание образцов данных

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

Создайте набор типовых категорий, в данном случае 20.

Создайте набор из 20 случайных целочисленных значений, соответствующих распределению Парето.

Распределение Парето дает нам набор данных, в котором есть несколько больших чисел, а остальная часть откладывается, что было бы аналогично бизнес-модели «Затраты по категориям». Если вы когда-нибудь слышали о правиле 80/20, оно основано на Парето.

Пример распределения Парето (Википедия):

Так как же нам создать образец данных, который следует такой схеме? Легко, numpy нас покрывает ...

Как выглядят наши образцы данных?

Отлично, теперь у нас есть достойный образец набора данных. Но читать непросто, давайте исправим ...

Визуализация всего

Когда дело доходит до построения визуализации, нам нужно помнить о нескольких важных моментах.

  • Мозг имеет тенденцию бороться, когда вы выходите за рамки полдюжины категорий и цветов.
  • Цвет должен быть зарезервирован для воздействия, он должен иметь значение и привлекать внимание. (Учтите, что это не всегда легко сделать.)
  • Круговые диаграммы добавляют к умственной нагрузке различение дуг и площадей, и когда значения близки, практически невозможно определить, какое значение больше.

Итак, что нам нужно сделать, чтобы решить вышеуказанное?

  • Оставьте 5 основных категорий в покое, чтобы они были разбиты, а остальные поместите в категорию Другое.
  • Избегайте цветов по умолчанию. Используйте оттенки нейтрального цвета или набор приглушенных цветов.
  • Откажитесь от круговой диаграммы и создайте вафельную диаграмму

Шаг 1. Определите несколько параметров

Я считаю, что намного проще вносить изменения, если я определю несколько ключевых параметров вверху. Тогда я могу быстро внести изменения, не копаясь в коде.

Давайте взглянем на наши данные и посмотрим, как они структурированы.

Немногое, давайте сделаем это полезным с помощью очень простой «разработки функций»…

Теперь у нас есть более мелкие категории в корзине «Другое». Чтобы подготовить набор данных для построения графика, нам нужно сделать несколько небольших шагов:

  • Сгруппируйте данные. Нам нужно просуммировать стоимость и «pct_raw» для каждой из новых категорий и получить min идентификатор сортировки. (Это дает нам общий процент «Другой корзины» и следующий идентификатор сортировки после наших групп, которые мы хотим разделить.)
  • Получите целое число, показывающее, сколько плиток представляет каждая категория.
  • Отсортируйте значения, чтобы они отображались на графике осмысленным образом.

Иногда плитки не суммируют то, что вы установили на графике (это nwaffle число) из-за округления. В этом случае одно из решений - увеличить сегмент Другое на 1 плитку.

Создание вафли

Поскольку служба Power BI не поддерживает нишевый пакет, который упрощает эту задачу, нам приходится создавать вафли с нуля. Теперь есть и другие способы выполнить часть кода, приведенного ниже, но я сделал это так же, как и сделал, поскольку думал, что это поможет сделать его более понятным.

Так что же происходит наверху?

  • [Строки 2–4] Я просто создаю массивы базовых значений из столбцов фрейма данных для категорий, плиток и стоимости.
  • [Строка 6] Я инициализирую двумерный массив нулей на основе параметров высоты и ширины, которые я определил ранее.
  • [Строка 8–9] Прежде чем мы сможем «Прогуляться по вафлям», мы устанавливаем наши отправные точки. Индекс категории indx_cat предназначен для определения цвета, а индекс плитки, indx_tile, для определения того, где мы находимся во время обхода 2D-массива.
  • [Строка 12–17] Здесь мы перемещаемся по массиву сверху вниз, слева направо. По мере продвижения он изменяет начальный 0 в каждой позиции на текущий установленный индекс категории. Позже он используется для присвоения категории соответствующего цвета.
  • [Строка 20] Определенный список цветовых кодов в том порядке, в котором мы хотим их использовать. Лучше всего использовать список той же длины, что и количество категорий (включая сегмент другое). В противном случае Matplotlib назначит другой оттенок, чем вы ожидаете.

Выше приведены единственные пакеты, которые нам нужны (если вы еще не импортировали их), и все они поддерживаются службой PowerBI.

Не забудьте дважды проверить версии своих пакетов (опять же, см. Их список здесь). На момент написания они используют Seaborn 0.10.1, тогда как текущая стабильная версия - 0.11.2. Используемые здесь методы не должны иметь проблем между версиями.

Кроме того, вы можете видеть, что я обновляю некоторые параметры для Matplotlib. Первый - это DPI - если вы не измените его, по умолчанию будет 72, что может выглядеть размытым при рендеринге в Power BI (или где-либо еще).

Приведенный выше код - это просто заключительная подготовительная работа перед кодом, который выполняет фактическое построение графика. Строка 1 просто преобразует наш список цветов в цветовую карту, которую может использовать Matplotlib.

Остальная часть приведенного выше фрагмента - это просто функция, которую я добавил для моего варианта использования, и она не требуется. У меня были проблемы с длинными метками, и это добавляло разрывы строк между словами, не обрезая середину слова.

Затем мы переходим к сути построения графиков данных.

Если вы уже знаете, что делает вышеперечисленное, отлично! Если нет, ничего страшного, давайте пройдемся по нему.

  • [Line 1] Устанавливает сюжет. Скорее всего, вам придется повозиться с figsize, чтобы получить то, что вам нужно. (18,6) работал лучше всего, чтобы минимизировать потерю пустого пространства в Power BI для моего графика 20x5.
  • [Строка 2] Берет наш 2D-массив номеров индексов категорий и отображает цвета, которые мы определили.
  • [Строки 4–5] Регулирует положение отметок так, чтобы мы получали четные квадраты. (Попробуйте закомментировать эту строку и запустить ее, вы поймете, что я имею в виду.)
  • [Line 7] Создает сетку осей, здесь мы делаем белую сетку со сплошными линиями и шириной линии 3.
  • [Строки 9–10] Избавляет от клещей, поскольку они нам не нужны.
  • [Строки 12–19] Здесь мы создаем нашу собственную легенду. Мы инициализируем пустой список для хранения частей легенды, затем просматриваем категории и массивы стоимости, чтобы определить каждую часть. Наконец, мы сообщаем Matplotlib, где его разместить.
  • [Строки 21–22] Это уберет беспорядок из черных меток по периметру и изменит их на белые, чтобы они сливались, так что они больше не видны.
  • [Строка 23] Удаляет ограничивающую рамку вокруг графика.
  • [Строка 24] tight_layout автоматически настраивает параметры подзаголовка так, чтобы подзаголовок (и) вписывался в область рисунка. Это экспериментальная функция, которая в некоторых случаях может не работать. Он проверяет только размеры меток, меток осей и заголовков . - Документация Matplotlib
  • [Строка 26] Покажите сюжет.

Результаты

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

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

Вот вид только в оттенках серого. Здесь я просто изменил ту строку, в которой мы определили цветовые коды.

Ниже представлен лучший вариант использования нейтральных цветов для отображения необходимых данных, но не «в центре сюжета», и цвета, чтобы подчеркнуть, где мы хотим, чтобы внимание было сосредоточено. Это согласуется с идеей сохранения цвета, чтобы произвести впечатление.

Если вы хотите увидеть весь код сразу, зацените его здесь, на Github. Есть блокнот Jupyter со всем кодом в одном месте.

Спасибо, что нашли время прочитать это. Надеюсь, вы получили из этого что-то полезное, что можно применить к сценарию реального мира. Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь комментировать.

Если вам понравилась эта статья, возможно, вам понравится еще одна из моих статей о творчестве с Matplotlib:



Больше контента на plainenglish.io