Версия: 2.0
Перекрёстное выделение
Визуал может реагировать на перекрёстное выделение из других визуалов. Как и перекрёстная фильтрация, оно требует дополнительных правил для желаемых визуальных эффектов. Поэтому соответствующие настройки по умолчанию выключены. Эта страница объясняет, как их включить и работать с данными, переданными визуалу.
Чем фильтрация отличается от выделения
Power BI предлагает три типа взаимодействия между визуалами: Filter («Фильтрация»), Highlight («Выделение») и None («Нет»).
Обычные визуалы Power BI скрывают от автора большую часть внутренней обработки. Чтобы управлять ею самостоятельно, нужно понять основные принципы. Ниже приведён простой разбор взаимодействий; более подробное описание есть в документации SDK пользовательских визуалов Power BI.
Предположим, есть диаграмма Sales («Продажи») по Country Code («Код страны»), а в Deneb мы хотим построить визуал Sales по Product («Продукт»). Пока представим его обычной таблицей:

Фильтрация
При взаимодействии Filter Power BI непосредственно обновляет поля набора данных визуала, передавая пересчитанные значения:

Итоги таблицы теперь соответствуют категории US. В наборе данных Deneb поле Sales получит те же значения, и наша диаграмма обновится ожидаемым образом.
Выделение
При взаимодействии Highlight нужно показать выделенные значения в контексте исходных. Набор данных будет выглядеть примерно так:

Это сочетание двух предыдущих таблиц: мера Sales сохраняет исходные значения, а дополнительный набор показывает продажи для выделенной страны в другом визуале.
Если поменять направление взаимодействия и выбрать строку таблицы, на столбчатой диаграмме появится похожий эффект:

Если пока не учитывать подписи данных, для каждой страны видны:
- Непрозрачный столбец — продажи выделенного продукта.
- Более прозрачный столбец — исходные продажи страны по всем продуктам.
Именно такой подход следует рассмотреть при реализации перекрёстного выделения в Deneb.
Если активного фильтра или выделения нет, но поддержка перекрёстного выделения включена, оба набора значений существуют и равны друг другу:

Что это означает для Deneb
Прежде чем перейти к настройке и использованию перекрёстного выделения, рассмотрим ещё несколько особенностей.
Визуалом является Deneb
- В отчёт вы добавляете пользовательский визуал Deneb. Power BI знает о возможностях, объявленных именно этим визуалом.
- Ваша спецификация выполняется внутри среды Deneb.
- Если визуал Power BI объявляет поддержку перекрёстного выделения, предполагается, что его код обработает соответствующие данные. Для отдельного специализированного визуала, который разрабатывается и распространяется как готовый пакет, это обычно естественно.
- Deneb служит средой для языка, на котором автор создаёт свою визуализацию. Но для Power BI именно Deneb должен обрабатывать перекрёстное выделение: поддержка заявлена на уровне визуала.
- Поэтому, чтобы предоставить возможность заинтересованным авторам, Deneb должен объявить её на уровне всего визуала.
Перекрёстное выделение требует дополнительного проектирования
Объявленная поддержка означает, что автору нужно учитывать эту возможность:
- Вы можете захотеть включить её и потратить время на необходимые правила. Но можете и отказаться — это допустимо.
- У многих пользователей Power BI в диалоге Options по умолчанию задано перекрёстное выделение, а не фильтрация:

- Если спецификация не обрабатывает выделение, а взаимодействия других визуалов с Deneb не переключены явно на Filter, результат может вызвать недоумение.
По описанным выше правилам визуал обычно не изменится: базовые, исходные значения остаются прежними.
Это может быть непривычно, но технически соответствует выбранному режиму. Авторам приходится одновременно изучать язык визуализации и внутренние механизмы Power BI.
Предположения для поведения по умолчанию
Подход Deneb основан на следующем:
- Вряд ли вы захотите реализовать выделение, не понимая описанного механизма.
- До знакомства с ним поведение может быть неочевидным.
- После его изучения вы понимаете необходимые действия и готовы явно включить поддержку.
Поэтому перекрёстное выделение не включено автоматически. Чтобы добавить его в свой визуал, выполните два шага, описанные ниже.
Рекомендуемые подходы
Выберите подходящий вариант и настройте визуал в соответствии с задачей. Последующие разделы объясняют, почему он работает именно так и какие данные доступны внутри визуала.
Deneb не может управлять взаимодействиями в заголовке визуала. Они находятся вне его содержимого и должны настраиваться автором отчёта вручную.
Только перекрёстная фильтрация
Если поддержка выделения в спецификации не нужна:
- Убедитесь, что Expose cross-highlight values for measures в разделе Cross-highlighting панели Project setup редактора выключена. По умолчанию она выключена, если только вы не загрузили шаблон, который её использует.
- Проверьте, что в настройках взаимодействия другие визуалы воздействуют на Deneb через Filter.
Как Deneb помогает, если взаимодействия не настроены
Если Expose cross-highlight values for measures выключена, но взаимодействие в заголовке не настроено, Deneb пытается внутри сопоставить выделенные значения с обычными полями мер, используя их исходные имена:

Перекрёстное выделение
Если спецификация должна поддерживать выделение:
- Включите Expose cross-highlight values for measures в разделе Cross-highlighting панели Project setup редактора. По умолчанию настройка выключена, если только её не использует загруженный шаблон.
- Убедитесь, что другие визуалы воздействуют на Deneb через Highlight в настройках взаимодействия.
Далее рассмотрим внутренний механизм и поля набора данных, необходимые для реализации.
Как работает перекрёстное выделение
Некоторые пункты повторяют предыдущие разделы, чтобы все условия были собраны вместе.
- Свойство Expose cross-highlight values for measures в разделе Cross-highlighting панели Project setup определяет, доступны ли значения выделения в наборе данных.
- По умолчанию оно выключено.
- Для каждой строки Deneb предоставляет специальные поля каждой меры. Используйте их в кодировании свойств примитивов, условиях или выражениях, чтобы различать выделенные и исходные значения.
- Когда в другом визуале выбирают точки и его взаимодействие с Deneb настроено как Highlight:
- Исходное значение меры сохраняется.
- Поля выделения обновляются сведениями из главного окна Power BI.
- Если активного выбора в другом визуале нет, выделенные значения мер существуют и равны исходным. Это показано выше.
- Автор должен использовать эти поля для визуальных эффектов спецификации. Простой подход приведён в практическом примере, дополнительные — ниже.
- Если настройка выключена, Deneb пытается передать выделенные значения через обычные поля.
Специальные поля __highlight
Перекрёстная фильтрация действует на строку целиком, а перекрёстное выделение — на отдельные меры. Если Expose cross-highlight values for measures включена, набор данных содержит дополнительные поля для каждой меры.
[measure name]__highlight — значение меры в контексте выделения. Исходное значение остаётся в обычном поле меры. Это позволяет отображать их отдельно.
[measure_name]__highlightStatus — состояние конкретной меры в контексте текущей строки. Оно похоже на __selected__, но относится к мере, а не ко всей строке. Возможные значения:
on— активно перекрёстное выделение, и эта мера выделена.off— активно перекрёстное выделение, но эта мера не выделена. Это чаще встречается при использовании нескольких мер.neutral— перекрёстного выделения нет. Исходное и выделенное значения равны.
[measure_name]__highlightComparator — заранее вычисленный результат сравнения выделенного и исходного значений. Он позволяет применять условное кодирование без отдельного calculate или аналогичного преобразования. Возможные значения:
eq— значения равны.lt— выделенное значение меньше исходного.gt— выделенное значение больше исходного.neq— значения не равны или их нельзя непосредственно сравнить; обычно используется для текстовых мер.
Пример изменения полей при выделении из другого визуала
Возьмём столбец Product и меру $ Sales, как в предыдущем разборе. После включения Expose cross-highlight values for measures набор данных выглядит так:

При выборе точки в другом визуале Power BI обновляет выделенные значения, а Deneb — соответствующие дополнительные поля:

Отображение состояния выделения через кодирование
Как и при перекрёстной фильтрации, визуал и его кодирование должны понятно передавать состояние выделения. Для специализированных визуалов Power BI это часто новая задача: готовые образцы и привычные схемы могут отсутствовать.
Обычно нужно показать выделенные значения относительно исходных, чтобы пользователь мог сравнить их в контексте.
Начать помогут простые практические примеры ниже. Они используют Vega-Lite, но обе версии шаблона Simple Bar Chart из диалога New Specification содержат базовые правила перекрёстного выделения.
Ограничения и особенности
- Выделенные значения доступны только для мер. Power BI не применяет этот механизм к столбцам.
Простые практические примеры
Примеры используют Vega-Lite, но аналогичные принципы применимы и к Vega.
Встроенный отчёт показывает варианты визуалов в Power BI на основе демонстрационной финансовой модели Power BI Desktop. Подсказки раскрывают все данные, чтобы вы могли наблюдать состояние полей __highlight. Дополнительная таблица показывает, как они меняются при перекрёстном выделении из стандартного визуала слева. Ниже приведены две базовые JSON-спецификации.
Пример 1. Перекрёстное выделение с помощью слоёв
Немного изменим подход к столбчатой диаграмме: через слои нарисуем два столбца — для исходного и выделенного значений. Положение x каждого связано с соответствующим полем:
{
"data": { "name": "dataset" },
"layer": [
{
"description": "Исходное значение",
"mark": {
"type": "bar",
"opacity": 0.3
},
"encoding": {
"x": { "field": "Sales" }
}
},
{
"description": "Выделенное значение",
"mark": {
"type": "bar"
},
"encoding": {
"x": {
"field": "Sales__highlight"
}
}
}
],
"encoding": {
"y": {
"field": "Product",
"type": "nominal"
},
"x": { "type": "quantitative" }
}
}
Пример 2. Добавление перекрёстной фильтрации
Первый пример поддерживает только перекрёстное выделение. Чтобы визуал мог также фильтровать другие визуалы, расширим кодирование opacity слоя выделения: если __selected__ равно off, его примитив скрывается. Под ним остаётся приглушённый примитив исходного значения:
{
"data": { "name": "dataset" },
"layer": [
{
"description": "Исходное значение",
"mark": {
"type": "bar",
"opacity": 0.3
},
"encoding": {
"x": { "field": "Sales" }
}
},
{
"description": "Выделенное значение",
"mark": {
"type": "bar"
},
"encoding": {
"x": {
"field": "Sales__highlight"
},
"opacity": {
"condition": {
"test": {
"field": "__selected__",
"equal": "off"
},
"value": 0
},
"value": 1
}
}
}
],
"encoding": {
"y": {
"field": "Product",
"type": "nominal"
},
"x": { "type": "quantitative" }
}
}