Бывает так, что сравниваемые линейные величины различаются между собой в десятки раз и cравнение их на линейных графиках или гистограммах не очень удобно для анализа. Чтобы представить в понятных диаграммах, приходится или включать «Log Scale», или разделять масштаб на две половины… Но есть и другое решение – объёмное сравнение!
В этом случае, масштаб сравниваемых величин будет уже эквивалентен корню из исходного числа и следовательно то, что раньше, к примеру, отличалось в 100 раз, в радиусе круга будет отличаться лишь в 10. Сегодня рассмотрим вариант объемного представления данных.
Итак, начнем, как всегда, по порядку
Исходные данные
Для данного примера подойдет любой источник данных, в котором можно выделить три поля: конечный набор типов данных, месяц(даты) и суммы:
1 2 3 4 |
type, month, data, `Type A`, 01, 9, `Type B`, 02, 34, `Type D`, 03, 96, |
Объемное сравнение: базовая визуализация
- Для рисования кругов создадим объект Пузырьковая диаграмма («Scatter Chart»), где укажем единственный дименшен:
type - Нажмем «Далее» и на следующей вкладке включим галочку Продвинутый режим («Advanced Mode»).
- Вернёмся назад на вкладку Выражения («Expressions») (кнопка «Назад»). Видим, что два выражения уже окажутся созданными, но мы их тут же заменяем на свои:
a) В качестве первого выражения пропишем:
=320+260*cos( Rank(Sum(data),1,1)*90/GetPossibleCount(type) ),
и назовем его «X» (в поле ввода Метка («Label»)).
b) Вместо второго выражения пропишем пока константу:
=0,
которую назовем соответственно «Y» (в поле ввода Метка («Label»)).
После выполнения этих действий получим:
- Теперь, чтобы размер кружков зависел от данных, необходимо создать на той же вкладке Выражения («Expressions») третье выражение:
Sum(data), - Теперь уберем все лишнее:
a) На вкладке Общие (General):
Убираем галочку Показать заголовок диаграммы («Show Title in Chart»).
b) На вкладке Измерения (Dimensions):
- Убираем для дименшена галочки Метка («Label») и Показать легенду («Show Legend»)
- Включаем галочку Скрыть, когда значение Null («Suppress When Value Is Null»)
c) На вкладке Оси (Axes):
Включаем галочки Скрыть оси («Hide Axis») у обоих осей X и Y.
d) На вкладке Сортировка (Sort):
- Уберем все галочки в блоке Сортировка по («Sort by»), а у выражения («Expression») включим галочку.
- Впишем формулу «SUM(data)»
- Выберем тип сортировки По убыванию («Descending»).
e) На вкладке Стиль (Style):
Переключим стиль отображения на «простые закрашиваемые круги».
Получим следующее:
- В таком виде анализировать неудобно – нужно увеличить максимальный размер отображаемого полукруга. Для этого на вкладке Представление (Presentation):
- Выключим галочку Всплывающие метки («Pop-up Labels»)
- Временно выключим галочку Авторизованные символы («Autosize Symbols»), чтобы ввести в поле Макс. Размер пузыря («Max Bobble Size») значение = 60
- Снова включим галочку Авторизованные символы («Autosize Symbols»)
- Присвоим свой цвет для каждого полукруга, т.е. для каждого типа данных. Для этого на вкладке Выражения («Expressions») у первого выражения X раскроем {+} и в Цвет фона («Background Color») впишем следующую формулу:
Pick( 1+Match(type,Type A
,Type B
,Type C
,Type D
,Type E
,Type F
),,
RGB(255,0,0), clATypeA, clATypeB, clATypeC, clATypeD, clATypeE, clATypeF),
Таким образом, сопоставим для каждого типа свой цвет.
- Сами цвета можно прописать либо константной функцией RGB, либо переменными, как в данном примере. Конечно, этим переменным надо заранее прописать в скрипте цветовые значения:
1 2 3 4 5 6 |
LET clATypeA = ARGB(150,80,160,240); LET clATypeB = ARGB(150,27,125,156); LET clATypeC = ARGB(150,0,64,128); LET clATypeD = ARGB(150,70,83,128); LET clATypeE = ARGB(150,96,66,136); LET clATypeF = ARGB(150,186,101,177); |
- На вкладке Цвета (Colors):
- Сделаем фон прозрачным: ползунок Прозрачность (Transparency) на 100%
- Границы и заголовок — отключим.
- Теперь займемся вертикальным сдвигом.
a) Ранее во второе наше выражение Y мы вписали константу ноль, но теперь создадим особую переменную
vDown,
и присвоим ей значение = 9.
b) После чего впишем во второе выражение Y следующую формулу:
=-vDown,
c) На вкладке Оси (Axes) установим для оси Y:
Static Min =0; Static max =200,
Объемное сравнение: настройка надписей данных
Если просто включить галочку «Метки на точках» («Labels on Datapoints») на вкладке Представление («Presentation»). В этом случае надписи типов, конечно, появятся над полусферами, но чем больше будет радиус круга, тем дальше от края круга будет надпись. Это не очень удобно для пользователя, поэтому поработаем с отображением надписей:
- Отключим обратно галочку «Метки на точках» («Labels on Datapoints») .
- Создадим копию нашего графика Пузырьковая диаграмма («Scatter Chart»):
- Копировать – Объект (Copy to Clipboard – Object),
- Вставить объект на лист (Paste Sheet Object)
- В этой копии – временно (только на период построения), поднимем Слой («Layer») выше (до уровня «Top», вкладка Макет («Layout»)), чтобы не задеть ранее созданный график. Далее всю разработку, делаем на копии.
- Чтобы уменьшить влияние дальности надписи от радиуса круга, на вкладке Выражения (Expressions):
Наше третье выражение SUM(data) надо обернуть функцией корня:
SQRT(SUM(data)),
Если отображаемые величины очень сильно отличаются друг от друга, тогда можно и дважды извлечь корень:
SQRT(SQRT(SUM(data))).
- Убираём отрисовку самих кругов:
- на вкладке Выражения (Expressions) раскроем {+} у первого выражения (X) и изменим функцию Цвет фона («Background Color») на ARGB(0,255,255,255),
- на вкладке Представление (Presentation):
- включаем галочку Точки на графике («Labels on Datapoints»),
- отключаем галочки «Highlight» и «Pop-up Labels».
- На вкладке Общие (General) включим галочку Только чтение («Read Only»).
- Чего-то все же не хватает. Давайте выведем надписями не только название группы, но и какие-нибудь вычисленные числовые значения и при этом на разных строчках. Для этого надо всего лишь подправить дименшин:
=type&chr(10)&AGGR(Sum(data),type),
Как видим, функция chr(10) делает перевод на новую строку, а функция AGGR рассчитывает нужную формулу для каждого типа «type».
- Теперь сдвинем надписи вправо так, чтобы их начало совпадало с центром полукруга или даже чуть правее. Для этого:
- заведем новую переменную
vLeft, - присвоим ей начальное значение = 320.
- заменим у первого выражения (X) на вкладке Выражения («Expressions») первое слагаемое в формуле «320» на переменную vLeft.
- обязательно зададим общий масштаб для оси X на вкладке Оси (Axes). Установим для оси X:
Static Min =0; Static max =640,
Этот же масштаб, кстати, надо установить и на объекте Пузырьковая диаграмма («Scatter Chart»), который рисует сами круги!
- Изменяя значение переменной vLeft, мы сдвигаем надписи по горизонтали.
При значении vLeft=345, получим вот такую визуализацию:
Объемное сравнение: линии к надписям
Можно было бы остановиться, но диаграмма смотрится гораздо нагляднее, если от каждого полукруга идут линии к надписям. Создадим их.
- Для этого необхордимо создать ещё один объект Пузырьковая диаграмма («Scatter Chart»). Клонируем теперь второй объект, рисуем надписи и временно на нём, на период построения, поднимая Слой («Layer») ещё выше (теперь все разработки делаем на нём).
- В скрипте нам снова необходимо создать одну вспомогательную таблицу:
12_ЛИНИИ:LOAD Rowno() as _ЛИНИЯ AUTOGENERATE 2; - Переходим на вкладку Измерения («Dimensions») и создаем ещё один вычисляемый дименшин:
1=IF( _ЛИНИЯ<=2, _ЛИНИЯ)
и передвигаем его на первое место (кнопка «Promote»).
- На вкладке Выражения (Expressions):
- В первом выражении (X) заменяем формулу на:
1vLeft-26+Round(260*cos( Rank(Sum(data),1,1)*90/GetPossibleCount(type) )) - Во втором выражении (Y) заменяем формулу на:
123Pick(_ЛИНИЯ,2*SQRT(SUM(data)/vMaxR)*90-vDown,SQRT(SUM(data)/vMaxR)*80-vDown )
- Третье выражение вообще удаляем
- У первого выражения (X) снова пропишем Цвет фона («Background Color») согласно нашей придуманной раскраске для каждого типа:
12Pick( 1+Match(type, `Type A`, `Type B`, `Type C`, `Type D`, `Type E`, `Type F`),RGB(255,0,0), clATypeA, clATypeB, clATypeC, clATypeD, clATypeE, clATypeF)
- На вкладке Presentation:
- Убираем галочку Значения на графике («Labels on Datapoints»)
- Сделаем Ширина линии («Line Width») = 1.
Последний штрих – убираем рабочие слои на задний план:
- Верхний объект с линиями переместить на самый нижний план (Слой (Layer=-3)),
- Следующий объект с надписями переместить на (Layer=-2)
- Тогда сам объект, который рисует круги окажется на самом верху и на нём можно, как обычно, мышкой делать выборки.
Вот теперь наш пример с объёмным сравнением и динамическими сносками полностью готов!
Поделитесь своим мнением о такой реализации в комментариях. Буду благодарен.
Свежие комментарии