Visualisations
July 14, 2021

Пользовательская сортировка в гистограмме с накоплением

В этот раз интересная задача попалась в телеграмм канале Power BI Group RU:

Необходимо, чтобы в визуальном элементе "Нормированная гистограмма" значения "накапливались" от большего к меньшему.
Требуемый итоговый результат

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

Стандартная настройка Нормированной диаграммы

И, к сожалению, такой порядок изменить простым способом не получится

Меню сортировки не доступно

Поэтому, чтобы решить нашу задачу, необходимо будет создать две вспомогательных таблицы и две специальные меры.

Сразу оговорюсь: решение не очень универсальное и рассчитано на то, что данный тип визуализации используется для отображения не более 10 условных обозначений, иначе доли будут уже не читабельны.

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

Таблица Countrys

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

Давайте посчитаем: У нас имеется всего 6 стран. Значит каждая страна в любой момент может иметь ранг от 1 до 6, соответственно мы получаем 6 вариантов расположения. Теперь, имея константу индекса страны и переменную варианта ранга мы с помощью математики можем составить уравнение, которое поможет сортировать страны в нужном нам порядке:

Порядковый номер = индекс+(вариант-1)*6

То есть минимальное и максимальное значение, которое мы можем получить это 1 и 36 соответственно. Зная все варианты для каждой страны мы создадим вторую вспомогательную таблицу:

Таблица ColorHistogram

В столбце HSort будет содержаться порядковый номер, в который мы будем помещать наш ранг, а по столбцу CountryIndex мы свяжем данную таблицу с таблицей Countrys, чтобы работала фильтрация:

Схема модели для настройки нормированной диаграммы

Далее нам необходимо создать меру, которая будет рассчитывать порядковый номер:

Мера !Гистограмма для расчёта порядкового номера

Да, приходится прописывать каждый вариант отдельной строкой, но это ещё не так много ручного труда - сложнее с визуализацией.

Добавим на лист "Нормированную диаграмму", в условные обозначения столбец ColorHistogram[Hsort], на ось столбец Calendar[Year], а в значения нашу меру [!Гистограмма].

Нормированная диаграмма "как есть"

Что мы видим? Во-первых, непонятные цифры в условных обозначениях, которых тем более больше, чем стран. Во-вторых, разнобой в цветах. Хотя, если посчитать количество долей в каждом столбце, то их будет как раз 6 - по количеству стран.

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

Настройка цветов

Но, как мы видим, здесь присутствуют не все значения из столбца ColorHistogram[Hsort], а только те, для которых рассчиталось значение в мере [!Гистограмма]. Поэтому для корректного отображения цветов, временно заменим в визуализации меру [!Гистограмма] на любую другую, чтобы настроить все 36 порядковых номеров, назначив им цвета, которые будут соответствовать странам.

Настройка цветов в соответствии со странами

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

После того как настроили цвета, нам необходимо отключить легенду - условные обозначения из цифр и создать собственную. Также я отключил для данной диаграммы название (и не забудьте вернуть меру [!Гистограмма])

Отключаем легенду и название

Для того, что бы создать собственную легенду, я создал ещё одну диаграмму, в которую добавил только столбец Calendar[Year] на ось и столбец Countrys[Country] в условные обозначения.

Затем, отключаем название для оси Y, после чего совсем её выключаем. Также задаем название для диаграммы:

Создание легенды условных обозначений

Далее, выделяем полученный визуальный элемент, вкладка "Формат" - "Переместить на задний план"

Настраиваем размещение легенды

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

Почти готовая визуализация

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

Мера подсказка

Вторым аргументом добавлена таблица ColorHistogram, чтобы получить контекст вычисления, так как связь у нас идет по направлению от Countrys.

Всё, наша визуализация готова.

Итоговый результат

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