5-2. Красивые подписи на временной оси. Derived Fields

При визуализации динамики во времени в Qlik распространено использование графиков с непрерывной осью измерения. Его основное преимущество — динамический масштаб, позволяющий уместить всю информацию с графика в том пространстве, которое под него выделено.

С неперерыной осью
Без непрерывной оси

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

Derived Fields

Создадим 2 визуализации: 2 графика с мерой sum(Платежи), с измерениями Дата и МесяцГод соответственно.

Чтобы получить красивые подписи на оси X, нужно сделать манипуляции на стороне скрипта. Разместите после генерации календаря этот код:

[AxisViz]: 
DECLARE FIELD DEFINITION
	FIELDS   
    Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis'),
	date(monthstart($1),'MMM') as Месяц Tagged ('$axis'),
    date($1,'D') as День Tagged ('$axis');
DERIVE FIELDS FROM FIELDS [Дата] USING [AxisViz];

Разберем что он делает. Эта конструкция создает так называемое определение полей AxisViz — перечень формул и меток, которые могут быть применены к производльным полям модели данных.

$1 в данной конструкции — обозначение поля, к которому данные формулы будут применяться. Также, вы можете увидеть, что помимо задания меток полей идет присвоение тегов через команду tagged (). Эта команда работает только в таком режиме, ее нельзя исопльзовать внутри load. Тег $axis как раз отвечает за то, что результаты формулы будут интерпретироваться как метки для осей.

Финализируется эта штука командой DERIVE FIELDS, в которой указывается к каким полям эти формулы применяются.

Загрузим данные. Подписи оси X графика по дням стали красивыми. А вот график по месяцам по-прежнему с подписями дней. Но прежде чем разбираться с этим, посмотрим что еще изменилось в визуальном слое.

Посмотрим в список полей. Мы увидим, что у поля Дата появился календарь, а в нем — те самые вложенные измерения из Derived Fields. Если календарика нет — обновите страницу.

Возможно вы спросите, а может надо было сразу делать календарь вот так? В конце концов, при загрузке данных через Диспетчер данных календари формируются именно таким образом. Я вам на это отвечу, что использовать такие календари как измерения диаграмм не нужно. По двум причинам:

  1. У таких полей всегда длинные составные метки, типа Дата.AxisViz.Year. Красоты нашей аналитике они не добавят;
  2. В отличие от календаря который делали мы, derived fields — не настоящие поля модели данных. Их значения вычисляются динамически в визуальном слое, что приведет к снижению производительности при большом объеме данных.

Теперь, подкрутим наш код. Добавим derived-полям тег $hidden, чтобы они не отображались в визуальном слое. И допишем второе поле, МесяцГод, чтобы эти метки также применялись и к нему.

[AxisViz]: 
DECLARE FIELD DEFINITION
	FIELDS   
    Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis','$hidden'),
	date(monthstart($1),'MMM') as Месяц Tagged ('$axis','$hidden'),
    date($1,'D') as День Tagged ('$axis','$hidden');
DERIVE FIELDS FROM FIELDS [Дата],[МесяцГод] USING [AxisViz];

Результат:

Как вы поняли, можно применять один и тот же набор derived-полей к нескольким полям модели данных.

Последовательность формул derived-полей важна, от нее зависит то в какой последовательности подписи будут стоять на диаграммах.

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

Результат:

Учитывайте, что для отображения derived-значения как подписи нужно, чтобы оно было типа Dual. Где текстовая часть отвечает за подпись, а числовая — за дату, к которой эта подпись относится. Например, если я хочу подписать месяцы в формате Дек 2020, то мне достаточно использовать функцию date(monthstart($1,’MMM YYYY’)). Т.к. функция date возвращает и числовое, и текстовое значение, т.е. является dual.

Но если я захочу сделать подпись вида число и день недели то конструкция будет такая:

dual(date($1,'D')&' '&weekday($1),date($1))

Потому что конструкция (date($1,’D’)&’ ‘&weekday($1) уже не является числом, и нужно с помощью Dual задать ей числовой эквивалент в виде даты, т.е. date($1).

Использовать Derived-поля в качестве измерений не надо.

3 комментария

  1. Евгений, спасибо, всегда много нового и интересного.
    Скажите, а можно отключить автоматически создаваемый скрипт с Derived-полями, чтобы не создавать кашу из своих календарных полей, своих derived-полей, а еще и автоматических?

    1. Автоматические Derived поля вроде создаются при загрузке данных через Диспетчер, а не скрипт. При загрузке через скрипт Derived полей не будет, если вы их сами не создадите.

Добавить комментарий для EvgeniyStuchalkin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.