Канал detail в Vega-Lite предназначен для задания дополнительного уровня группировки данных без влияния на визуальные свойства графика. Он используется тогда, когда необходимо разбить данные на категории для агрегации или независимого отображения элементов, но при этом не менять их цвет, форму, позицию или любой другой визуальный атрибут.
В системе декларативной визуализации Vega-Lite данные часто
группируются автоматически на основе каналов кодирования, таких как
x, y, color, shape,
size. Эти каналы не только определяют внешний вид графика,
но и влияют на то, как выполняется агрегация данных.
Канал detail выполняет иную функцию:
Таким образом, detail можно рассматривать как механизм
«скрытого разбиения» данных.
При построении визуализаций Vega-Lite формирует группы данных,
которые определяют, как вычисляются агрегаты (например,
mean, sum, count). Любой канал,
участвующий в кодировании, становится частью ключа группировки.
Если требуется сохранить визуально единый стиль, но при этом
разделить данные внутри вычислений, используется
detail.
Ключевая особенность:
| Канал | Влияет на внешний вид | Участвует в группировке | Назначение |
|---|---|---|---|
| color | да | да | различение категорий |
| shape | да | да | визуальная дифференциация |
| size | да | да | масштабирование |
| detail | нет | да | скрытая группировка |
Канал detail особенно важен в ситуациях, когда
визуальное кодирование уже занято, но требуется сохранить разбиение
данных.
В Vega-Lite detail задаётся в блоке
encoding как массив полей.
{
"data": {"url": "data.csv"},
"mark": "circle",
"encoding": {
"x": {"field": "value", "type": "quantitative"},
"y": {"field": "category", "type": "nominal"},
"detail": [{"field": "id", "type": "nominal"}]
}
}
В этом примере:
x и y;id обрабатывается отдельно.Когда несколько наблюдений имеют одинаковые значения по осям, но должны учитываться отдельно:
{
"mark": "circle",
"encoding": {
"x": {"field": "time", "type": "temporal"},
"y": {"field": "value", "type": "quantitative"},
"detail": [{"field": "sensor_id"}]
}
}
Каждый sensor_id формирует отдельную группу расчётов,
даже если точки перекрываются.
При использовании агрегатов detail предотвращает
«слияние» строк:
{
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"aggregate": "sum", "field": "amount"},
"detail": [{"field": "transaction_id"}]
}
}
Без detail возможна потеря гранулярности, если данные
требуют более тонкой группировки.
detail позволяет добавлять дополнительные измерения, не
перегружая визуальные каналы:
{
"mark": "line",
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": "value", "type": "quantitative"},
"detail": [{"field": "series"}, {"field": "region"}]
}
}
Здесь создаются отдельные линии для комбинаций series и
region, но визуальные параметры линий остаются
одинаковыми.
При наличии агрегирующих функций Vega-Lite формирует группы по всем
полям, участвующим в кодировании и в detail.
Пример:
x = categoryy = sum(value)detail = idРезультат:
id;category.Канал detail часто используется совместно с
трансформациями:
aggregatestackwindowfilterОсобенно важно его использование при aggregate, когда
требуется сохранить исходную детализацию.
Хотя концептуально detail похож на groupby,
различие заключается в уровне применения:
groupby в transform формирует новые
данные;detail влияет только на этап визуального
кодирования.Пример transform:
{
"transform": [
{
"aggregate": [{"op": "sum", "field": "value", "as": "total"}],
"groupby": ["category", "id"]
}
]
}
Эквивалент через detail:
{
"encoding": {
"x": {"field": "category"},
"y": {"aggregate": "sum", "field": "value"},
"detail": [{"field": "id"}]
}
}
В многослойных графиках detail работает локально в
пределах слоя:
detail не переносится между слоями;В интерактивных визуализациях detail часто используется
для:
selection;Пример:
{
"selection": {
"hover": {
"type": "single",
"on": "mouseover",
"fields": ["id"]
}
},
"mark": "circle",
"encoding": {
"x": {"field": "x"},
"y": {"field": "y"},
"detail": [{"field": "id"}]
}
}
Канал detail выполняет функцию связующего слоя
между:
Он позволяет сохранять высокую гранулярность данных без увеличения визуальной сложности графика, обеспечивая баланс между точностью вычислений и чистотой отображения.