Хочу предложить интересный пример отображения значений групп и составляющих их подгрупп путем разделения потока на отдельные рукава, ширина которых как в начале потока, так и в конце полностью эквивалентна числовым значениям групп и подгрупп, из которых они состоят.
Исходные данные
Для данного примера нам понадобится любая таблица, в которой есть колонка «группа», «подгруппа» и «сумма», например вот такая:
1 2 3 4 5 6 7 8 |
GROUP, SUBTYPE, VAL `Group-A`, `Type-1`, 45 `Group-A`, `Type-2`, 25 `Group-A`, `Type-3`, 15 `Group-A`, `Type-4`, 15 `Group-B`, `Type-5`, 20 `Group-B`, `Type-6`, 30 `Group-B`, `Type-7`, 10 |
НА ЗАМЕТКУ! Предупреждаю, что пример сложный, и желательно, чтобы для данной визуализации количество групп было не более трех, а количество разных подгрупп не более 8.
Вспомогательные таблицы
Для реализации нам понадобится в скрипте создать две вспомогательные таблицы:
1 2 |
_ТОЧКИ: LOAD Rowno() as _ТОЧКА AUTOGENERATE 100; |
и
1 2 |
_ЛИНИИ: LOAD Rowno() as _ЛИНИЯ AUTOGENERATE 100; |
Константы
Присвоим в скрипте переменным некоторые константы:
1) общее количество линий, которыми рисуем все потоки
LET vLines = 40;
2) точка с которой начинается переход с одной высоты на другую
LET Ts = 40;
3) точек, отведенное на плавный переход с одной высоты на другую
LET T = 8;
4) общий масштаб объекта по высоте (точек), прописанный в «Static Max»
LET H = 80;
Визуализация «Расщепление потока»
- Создаем обычный объект Линейный график («Line Chart»).
- В качестве первого дименшина, указываем расчетный и вводим:
=IF( _ТОЧКА<=100, _ТОЧКА) - Второй дименшин тоже указываем расчетный и вводим:
=IF( _ЛИНИЯ<=vLines, _ЛИНИЯ) - Нажмем далее и на вкладке Выражения («Expressions») введем пока временное выражение:
=_ЛИНИЯ
и назовем его «Y» (в поле ввода Метка («Label»)).
- Итак, наша задумка — рисовать линии, каждая из которых состоит из 100 точек, а все вычисления — будут в одном единственном выражении, вычисляющем {Y} в зависимости от номера линии и номера точки {X}.
- Но перед тем как составлять такое выражение, сначала подготовим объект:
a) На вкладке Общие (General):
- Отключаем галочку Показать заголовок диаграммы («Show Title in Chart»),
- Включаем галочку Только чтение («Read Only»).
b) На вкладке Dimensions
- У обоих дименшинах отключаем галочки Метка («Label») и Показать легенду («Show Legend»),
- Включаем галочку Скрыть, когда значение Null («Suppress When Value Is Null»).
c) На вкладке Sort:
Для обоих дименшинов отмечаем лишь галочку Числовое значение (Возрастание) («Numeric Value» (Ascending)).
d) На вкладке Presentation:
- Выключаем галочки Показать легенду («Show Legend»), Всплывающие метки («Pop-up Labels») и Подсветка («Highlight»),
- Установим ширину линий Ширина линии («Line Width»)=7 и размер точек Размер символа («Symbol Size»)=4.
e) Также нам надо установить галочку Показывать все столбцы («Show All Bars»), но, как видим, она неактивна. Не беда:
- временно перейдем на вкладку Общие («General»)
- выберем тип графика – Гистограмма («Bar Chart»),
- обратно вернёмся на вкладку Представление («Presentation»)
- Включим галочку Показывать все столбцы «Show All Bars».
- Снова перейдем на вкладку Общие («General») и выберем, как было ранее тип графика Линейный график («Line Chart»).
- Будем создавать пример с расщепляющимся потоком для двух групп и семи подгрупп.
a) Раскрасим линии каждой группы своим цветом, да к тому же ещё и с растяжкой по градиенту:
- на вкладке Выражение («Expression») раскроем {+} у нашего единственного выражения и в Цвет фона («Background Color») впишем:
123IF(_ЛИНИЯ <= vLines*SUM(IF(Match(GROUP,FieldValue(`GROUP`,1)),VAL))/SUM(total VAL),ColorMix1(_ТОЧКА/100, RGB(0,64,128), RGB(149,178,210)),ColorMix1(_ТОЧКА/100, RGB(196,64,0), RGB(255,192,100)) )
При использовании функции FieldValue можно не привязываться к заранее известным значениям групп, хранящихся в поле GROUP, а подставлять их динамически. - На вкладке Оси (Axes) Установим вертикальный масштаб для нашего поля:
- включим Стат. макс. («Static Max») и укажем для него переменную H, в которую мы записали константу 80,
- в Стат.мин («Static Min») впишем ноль
- саму ось Y выключим, установив галочку Скрыть ось («Hide Axis»).
- Отключим границы и заголовок.
В итоге получим следующее:
b) Чтобы прописать нашу формулу в выражении в компактном виде нам понадобится создать 3 новых вычисляемых переменных, да ещё и с передаваемыми в них параметрами:
i. Создадим первую переменную {calcYG}, которая будет вычислять Y для линий, которые показывают начало потока, суммы по группе:
1 2 3 4 5 6 |
LET calcYG = `IF($1<=vLines*SUM(IF(Match(GROUP,FieldValue(GROUP,1)),VAL))/SUM(VAL), H*SUM(IF(Match(GROUP,FieldValue(GROUP,1)),VAL))/4/SUM(VAL), H*(SUM(IF(Match(GROUP,FieldValue(GROUP,1)),VAL))/2 +SUM(IF(Match(GROUP,FieldValue(GROUP,2)),VAL))/4 )/SUM(VAL) ) + $1`; |
Замечу, что внутри этой формулы не двойные кавычки, а две подряд одинарные (а вместо $1 в формуле будет подставляться параметр, который мы будем передавать в эту переменную). Таким образом, в QlikView обычную переменную можно превратить в функцию.
ii. Вторую первую переменную {calcST}, создадим для того, чтобы подсчитывать накопительную сумму по текущим подтипам, попадающих в фильтр.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
LET calcST = `Pick( $1, SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2), FieldValue(``SUBTYPE``,3)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2), FieldValue(``SUBTYPE``,3), FieldValue(``SUBTYPE``,4)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2), FieldValue(``SUBTYPE``,3), FieldValue(``SUBTYPE``,4), FieldValue(``SUBTYPE``,5)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2), FieldValue(``SUBTYPE``,3), FieldValue(``SUBTYPE``,4), FieldValue(``SUBTYPE``,5), FieldValue(``SUBTYPE``,6)), VAL)), SUM(IF(Match(SUBTYPE, FieldValue(``SUBTYPE``,1), FieldValue(``SUBTYPE``,2), FieldValue(``SUBTYPE``,3), FieldValue(``SUBTYPE``,4), FieldValue(``SUBTYPE``,5), FieldValue(``SUBTYPE``,6), FieldValue(``SUBTYPE``,7)), VAL)) )`; |
в неё в качестве параметра будем передавать номер подтипа (от 1 до 7).
iii. Третью переменную {calcYT} создадим для того, чтобы вычислять Y для линий, которые показывают конец потока, суммы по подгруппам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
LET calcYT = REPLACE(` IF( $1 <= vLines*#(calcST(1))/SUM(VAL), H*#(calcST(1))/4/SUM(VAL), IF( $1 <= vLines*#(calcST(2))/SUM(VAL), H*(#(calcST(1))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,2)), VAL))/4 )/SUM(VAL), IF( $1 <= vLines*#(calcST(3))/SUM(VAL), H*(#(calcST(2))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,3)), VAL))/4 )/SUM(VAL), IF( $1 <= vLines*#(calcST(4))/SUM(VAL), H*(#(calcST(3))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,4)), VAL))/4 )/SUM(VAL), IF( $1 <= vLines*#(calcST(5))/SUM(VAL), H*(#(calcST(4))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,5)), VAL))/4 )/SUM(VAL), IF( $1 <= vLines*#(calcST(6))/SUM(VAL), H*(#(calcST(5))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,6)), VAL))/4 )/SUM(VAL), IF( $1 <= vLines*#(calcST(7))/SUM(VAL), H*(#(calcST(6))/2 +SUM(IF(Match(SUBTYPE,FieldValue(``SUBTYPE``,7)), VAL))/4 )/SUM(VAL) )))))))+$1`, `#`, `$`); |
В эту переменную мы будем передавать номер рисуемой линии.
c) Итак, у нас всё готово, чтобы изменить наше выражение {Y} на основную формулу расчета, теперь она будет выглядеть намного компактнее:
1 2 3 4 |
=IF(_ТОЧКА<=Ts, @(calcYG(_ЛИНИЯ)), IF(_ТОЧКА<=Ts+T+T, @(calcYG(_ЛИНИЯ)) +((@(calcYT(_ЛИНИЯ)))-(@(calcYG(_ЛИНИЯ))))*(1+sin( Pi()*(_ТОЧКА-Ts-T)/T/2))/2, @(calcYT(_ЛИНИЯ)) )) |
- Осталось заметить, что рисуя линию, QlikView сглаживает цвет из-за масштабирования при отрисовке под размеры объекта. Из-за чего мы можем наблюдать светлые черточки вместо сплошной линии. Но это можно исправить, если на вкладке Выражения («Expressions») для нашего выражения включим ещё и галочку Символ («Symbol») и выберем тип символа Точки («Dots»).
Вот и получили пример визуализации распределения потоков.
Кстати, числа показывающие суммы по группе в начале потока, реализуются объектом Гистограмма («Bar Chart)», который рисует Стопки («Staked») прозрачными блоками высотой по аналогии с вычислением начала линий потока и выводит для некоторых из них значение по группе. Этот объект вы можете изучить самостоятельно на первом шаге этого примера.
Ну и на этом, второй выпуск «Альманаха визуализации QlikView» завершен! На следующей неделе выложу файл .qvw в выпуском Альманаха.
До скорых встреч!
Свежие комментарии