Вступление
В этом примере покажу, как можно оживить графики в QlikView. Начнем с самых простых линейных диаграмм.
Под верхним графиком среднесуточной температуры за один месяц есть более общий график среднесуточной температуры сразу за целый год, разделенный вертикальными линиями на месяцы. Попробуйте выбрать на нём любой другой месяц, и вы увидите? как верхний график тут же оживает, начиная обновляться по новым данным.
Если раскрыть правую боковую панель: «Панель управления», то на ней вы найдете список других видов анимаций с данным графиком. Попробуйте повыбирать и их тоже.
Перейдем к построению…
Исходные данные
Рассмотрим пример динамики среднесуточной температуры за выбранный месяц. Для данного примера подойдет любой источник данных, в котором можно выделить три поля: Месяц, ДеньМесяца и некая мера «Среднесуточная»:
1 2 3 4 5 6 |
Месяц, ДеньМесяца, Среднесуточная 1, 1,-2.38 1, 2, 0.88 1, 3, 1.5 1, 4,-0.12 ...... |
Создадим сначала обычный «List Box» по полю «Месяц» и выберем в нём на период построения один любой месяц.
Далее построим обычный линейный график без какой-либо анимации. Создаем Line Chart.
При создании на первой вкладке «General» сразу уберём галочку «Show Title in Chart» и нажимаем кнопку «Далее >».
На вкладке Dimensions:
В качестве дименшина выбираем поле: ДеньМесяца, и переходим далее…
На вкладке Expressions:
добавляем одно выражение SUM(Среднесуточная)
И поменяем для него стиль отрисовки линии на «Smooth» (что в выпадающем списке, справа от галочки «Line»). Нажимаем «Готово».
Пример (А)
На вкладке Axes:
В верхнем блоке «Expression Axes» чтобы включить отрисовку линии оси Y, увеличим параметр Width с нуля до 1, указав цвет оси.
Также в блоке «Expression Axes» нажмем на кнопку «Font» и выберем шрифт для оси Y: Arial полужирный 9, цвет зададим RGB(27,125,156) (тот же самый цвет скопируем и в первый цвет на вкладке «Colors»)
В блоке «Dimension Axis» включим галочку «Show Grid».
На вкладке Presentation:
Увеличим толщину линии до 3 (поле ввода «Line Width») и уберём галочки «Pop-up Labels» и «Highlight».
На вкладке Caption отключим все специальные иконки: («Print», «Send to Excel», «Allow Minimize» и «Allow Maximize»), а в поле «Title Text» пропишем формулу:
1 2 |
=`Москва. Среднесуточная температура` &IF(Месяц,` за ` &Date(MakeDate(2015,Месяц),`MMMM YYYY г.`)) |
На вкладке Number в поле ввода «Symbol» впишем: °C
Получили пример (Б).
Пример (Б)
Теперь всё готово к оживлению нашего графика…
Добавляем анимацию.
Для оживления графика нам понадобится в скрипте создать вспомогательную таблицу:
animation:
1 |
LOAD RowNo() as ID AUTOGENERATE 31; |
Количество шагов анимации может быть абсолютно любым, но в нашем случае для одного из примера анимации («БЕГУНОК») мы будем рисовать линию по дням месяца, которых максимально может быть как раз 31.
Теперь перейдем на вкладку Dimensions и добавим второй дименшен, выбрав поле ID. Только переместим этот дименшен на первое место (используем кнопку «Promote»).
Предыдущий дименшен «ДеньМесяца» окажется вторым. Не уходя с вкладки, нажмем кнопку «Animate…». В появившемся окне настроек включаем галку «Animate First Dimension».
Далее время между отрисовками кадров (параметр «Time Between Values (ms)») вписываем равным 50 и, следовательно, получается 20 кадров в секунду. Этот параметр 20 и вписываем в поле «Frame per Second». Ставим галочку «Autoplay», оставляя параметр «Play Once» не включенным.
Ну, а теперь мы можем использовать параметр «ID» в своих выражениях как угодно, зная, что во время анимации он будет меняться от 1 до 31.
Например, чтобы реализовать пример анимации «БЕГУНОК», надо вместо выражения написать уже вот такое:
1 |
IF( ДеньМесяца<=ID, SUM(Среднесуточная)) |
Пример (В)
Управление анимацией, что расположено под графиком, можно скрыть, наложив на неё сверху белую полоску «Text Object» или любой другой объект, а можно и оставить.
Давайте посмотрим, как можно поменять нашу формулу выражения, чтобы получить другие эффекты анимации.
Анимация «ВОДОПАД» получается, если прописать формулу:
1 |
MAX(TOTAL Среднесуточная) - (MAX(TOTAL Среднесуточная)-Среднесуточная)*ID/31 |
Анимация «ПЛАВЛЕНИЕ» получается, если прописать формулу:
1 2 3 4 |
IF( Среднесуточная>=AVG(TOTAL Среднесуточная), MAX(total Среднесуточная) - (MAX(total Среднесуточная)-Среднесуточная)*ID/31, MIN(total Среднесуточная) + (Среднесуточная-MIN(total Среднесуточная))*ID/31 ) |
Анимация «РАСПРЯМЛЕНИЕ» получается, если прописать формулу:
1 2 3 4 |
IF( Среднесуточная>=AVG(TOTAL Среднесуточная), AVG(total Среднесуточная) + (Среднесуточная-AVG(total Среднесуточная))*ID/31, AVG(total Среднесуточная) - (AVG(total Среднесуточная)-Среднесуточная)*ID/31 ) |
Анимация «СТРУНА» получается, если прописать формулу:
1 |
Среднесуточная + IF(ODD(ДеньМесяца),1,-1)*3*(31-ID)/31*sin(5*Pi()*(31-ID)/31) |
Ну, и анимация «ПАДЕНИЕ» получается, если прописать формулу:
1 |
Среднесуточная -(MAX(total Среднесуточная)-MIN(total Среднесуточная))*(ID-31)/31 |
Но, в отличии от предыдущих анимаций для этой надо ещё зафиксировать границы по оси Y, чтобы «падение» графика шло из-за границ области графика.
Для этого перейдем на вкладку Axes и включим «Static Min», прописав для него формулу:
1 2 3 |
MIN(Среднесуточная) и включим "Static Max", прописав для него формулу: MAX(Среднесуточная) |
Если мы хотим показывать на графике ещё и сами значения, то для нашего выражения (на вкладке «Expression») включим галочку «Values on Data Points». Но чтобы при движении эти цифры не менялись, придется обернуть нашу формулу выражения дополнительно функцией DUAL, вот так:
1 2 |
DUAL( Num(Среднесуточная,`###0.0`,`.`), Среднесуточная -(MAX(total Среднесуточная)-MIN(total Среднесуточная))*(ID-31)/31) |
Живые графики в QlikView: Приём «прореживания»
Когда точек на графике слишком много и они из-за малой ширины объекта наползают друг на друга, можно применить следующий прием «прореживания». Оставим только те надписи, которые находятся на пиках графика. Для этого будем управлять цветом выводимых меток на графике.
На этой же вкладки «Expression» раскроем (+) у нашего выражения и для «Text Color» пропишем вот такую формулу:
1 2 |
IF( Column(1)>Above(Column(1)) AND Column(1)>Below(Column(1)), black(), ARGB(0,0,0,0)) |
Пример (Г)
Приём управления фоном линейного графика
Рассмотрим пример, как можно задавать задний фон у линейного графика. Тут не идет речь о подстановке в качестве фона статической картинки, как умеет Qlik, а покажем, как можно сделать фон динамически зависимым от выбранных данных на графике.
Данный метод подходит не только для разделения фона графика на несколько горизонтальных зон, но и для цветового разделения на вертикальные зоны тоже (пример такого вертикального разделения на зоны вы уже видели на 1 шаге данного примера, когда делается подсветка выбранного месяца на нижнем графике).
Итак, продолжим работу с нашим примером Г, на котором мы остановились на предыдущем шаге. Для конструирования раскраски фона графика нам надо сначала переключить Chart на другой тип объекта.
На вкладке General переключим тип объекта на «Combo Chart».
Перейдем на вкладку Expressions, чтобы на будущем фоне хорошо были видны узловые точки нашего графика, сделаем эти точки белого цвета. Для этого выберем существующее первое выражение и для него включим дополнительно ещё и галочку «Symbol» (выбрав тип точки «Circles»).
Нажмем теперь кнопку «Add» и добавим второе выражение, аналогично первому:
1 2 |
DUAL( Num(Среднесуточная,`###0.0`,`.`), Среднесуточная -(MAX(total Среднесуточная)-MIN(total Среднесуточная))*(ID-31)/31) |
Для нового выражения выберем галочку «Symbol» (но с типом точки «Dots»), а галочку «Line» уберем (чтобы эти точки рисовались белым цветом просто пропишем для второго выражения «Background Color» формулу white() ).
Включим теперь галочку «Values on Data Points» для второго выражения и выключим её у первого. Перенесём так же и свойство «Text Color» из первого выражения во второе.
Сделаем теперь фон графика, используя возможность объекта «Combo Chart» выводить кроме линий ещё и прямоугольные гистограммы.
Для этого создадим третье выражение, которое будет отвечать за раскраску положительных температур:
1 |
IF( MAX(TOTAL Среднесуточная)>0, MAX(TOTAL Среднесуточная)+2, 0) |
и выберем тип отрисовки для третьего выражения, на этот раз «Bar»(галочку «Line» выключим)
Добавим четвертое выражение для раскраски отрицательных температур:
1 |
IF( MIN(TOTAL Среднесуточная)<0, MIN(TOTAL Среднесуточная)-2, 0) |
и тоже выберем для него тип отрисовки «Bar». Галочку «Line» выключим.
Чтобы отображаемые гистограммы соединились один под другим, перейдем на вкладку Style и переключим стиль группировки на «Stacked».
НА ЗАМЕТКУ! Если переключатель выбора стиля группировки «Stacked» не активен, то временно переключаемся на вкладку «General», выбираем тип объекта «Bar Chart», обратно переключаемся на вкладку «Style», переключаем тип на «Stacked», возвращаемся на вкладку «General» и возвращаем тип объекта на «Combo Chart»).
На вкладке Presentation выключаем галочку «Show Legend», чтобы не показывать легенду на графике.
НА ЗАМЕТКУ! Если в какой-то момент у вас перестают отрисовываться на графике метки в узловых точках, то надо просто увеличить параметр «Max Values Shown». В нашем случае увеличим параметр до 200).
При цветах по умолчанию (на вкладке «Colors»), получим пример (Д).
Пример (Д)
Соединим выводимые на заднем фоне графика гистограммы, чтобы между ними не оставалось пробелов. Для этого на этой же вкладке «Presentations» поставим
параметр «Bar Distance» и «Cluster Distance» равными нулю.
Теперь «восстановим» серую горизонтальную линию, которая рисовала ось X (созданные гистограммы стали перекрывать её)
Для этого в блоке «Reference Lines» создадим эту линию. Нажимаем кнопку «Add…» и в открывшейся форме у «Expression» вписываем 0, цвет меняем на серый, а стиль сплошная линия.
На вкладке Colors установим нужные цвета для положительной и отрицательной части графика.
Для третьего (сверху) цвета делаем вертикальную растяжку от цвета RGB(254,233,216) к цвету RGB(251,185,132). А для четвертого (сверху) цвета сделаем вертикальную растяжку от цвета RGB(216,234,252) к цвету RGB(132,188,244).
И последний штрих. Рассмотрим приём создания чередующейся вертикальной раскраски.
Этот простейший способ подходит, если дименшен представлен идущими подряд числами/датами или как у нас днями месяца.
НА ЗАМЕТКУ! Если дименшен произвольный или не числовой, тогда создается вспомогательное, скрытое выражение, которое задает последовательность ноль-один… на основе предыдущего своего же значения «Above»).
Итак, для нашего случая доработаем 3 и 4 выражение вот так…
Третье выражение:
1 2 |
IF( ODD(ДеньМесяца), IF(MAX(TOTAL Среднесуточная)>0, MAX(TOTAL Среднесуточная)+2, 0)) |
Четвертое выражение:
1 2 |
IF( ODD(ДеньМесяца), IF(MIN(TOTAL Среднесуточная)<0, MIN(TOTAL Среднесуточная)-2, 0)) |
Но теперь понадобится создать ещё 5 и 6 выражение.
Пятое выражение:
1 2 |
IF( EVEN(ДеньМесяца), IF(MAX(TOTAL Среднесуточная)>0, MAX(TOTAL Среднесуточная)+2, 0)) |
И шестое выражение:
1 2 |
IF( EVEN(ДеньМесяца), IF(MIN(TOTAL Среднесуточная)<0, MIN(TOTAL Среднесуточная)-2, 0)) |
Для обоих новых выражений, конечно же, ставим «Bar», а цвета для них на вкладке «Colors» сначала скопируем из 3 и 4 цвета в 5 и 6, только потом для цвета 5 и 6 передвинем слегка ползунок прозрачности. Получился пример (Е).
Пример (Е)
Ранее я уже говорил, что данный приём можно использовать для разных целей. Как одно из таких решений привожу пример, когда формируемый описанным способом фон используется для отображения дополнительной информации. В этом примере фоновые гистограммы показывают разброс за этот день максимальной и минимальной температуры за всю историю наблюдений. Кроме того более «насыщенной» раскраской показывается в какие дни был установлен исторический рекорд максимальной или минимальной температуры.
Если в исходной таблице добавить уже готовые или рассчитанные колонки «Минимальная» и «Максимальная» температура за всю историю наблюдений, то тогда отличие от предыдущего решения — замена 3,4,5,6 выражения на вот такие…
Третье выражение:
1 2 3 4 5 |
IF( Максимальная>0 AND Минимальная>0, Минимальная, 0) и "Background Color" для него: ARGB(0,255,255,255) |
Четвёртое выражение:
1 |
IF( Максимальная>0, Максимальная-RangeMax(Минимальная,0), 0) |
и «Background Color» для него:
1 2 3 4 |
IF( Максимальная>0, IF( Минимальная>0 AND Среднесуточная<=Минимальная, RGB(250,165,95), IF( Среднесуточная>=Максимальная, RGB(250,165,95), ARGB(180,251,185,132) )), ARGB(0,255,255,255) ) |
Пятое выражение:
1 2 3 4 5 |
IF( Максимальная<0, Максимальная, 0) и "Background Color" для него: ARGB(0,255,255,255) |
И шестое выражение:
1 2 3 4 5 |
IF( Минимальная<0, Минимальная-RangeMin(Максимальная,0), 0) и "Background Color" для него: IF( Среднесуточная<=Минимальная, RGB(132,188,244), ARGB(180,132,188,244)) |
Кроме того, надо подправить формулы принудительного определения максимума и минимума графика на вкладке «Axes»: параметр «Static Min» теперь:
1 2 3 4 5 |
MIN(TOTAL RangeMin(Среднесуточная,Минимальная,0)) а параметр "Static Max" теперь: MAX(TOTAL RangeMax(Среднесуточная,Максимальная,0)) |
Пример (Ж)
Друзья, на этом сегодня статья подошла к концу. До новых встреч в продолжении выпуска Альманаха визуализации!
Пишите свои комментарии и соображения. Буду рад обратной связи!
Большое спасибо за столь подробное описание.
По Вашему описанию все получилось. Но решила сделать немного иначе. По годам и месяцам. ID сделала 12 (по кол-ву месяцев в году) и если выбран один год то все получается хорошо, но если несколько, то месяца заполняются в 17 и 18 годах одновременно, как сделать чтобы заполнение было последовательным? сначала по одному году а потом перешло на следующий?
Заранее спасибо!