Канал shape в Vega-Lite используется для кодирования
категориальных данных через форму графических маркеров. Он применяется
преимущественно к точечным графикам и диаграммам рассеяния, где различие
объектов по форме служит дополнительным визуальным измерением наряду с
цветом, размером и положением.
Канал shape предназначен для визуального различения
дискретных категорий. В отличие от непрерывных шкал (например,
x, y, size), он работает
исключительно с категориальными или порядковыми данными.
Основная задача:
Использование shape ограничено mark-типами,
поддерживающими символы, прежде всего point.
Канал shape работает только с маркерами, имеющими
символическое представление:
point — основной типcircle (как фиксированная форма, но может быть
переопределена)squaretrianglecrossdiamondtriangle-up, triangle-down,
triangle-right, triangle-leftstroke-варианты (в зависимости от renderer-а Vega)При использовании shape Vega-Lite фактически выбирает
символ из набора SVG-подобных примитивов Vega.
Канал задаётся внутри encoding объекта:
{
"mark": "point",
"encoding": {
"x": { "field": "sepalLength", "type": "quantitative" },
"y": { "field": "sepalWidth", "type": "quantitative" },
"shape": { "field": "species", "type": "nominal" }
}
}
Здесь species определяет форму каждой точки.
Канал корректно работает с ограниченным набором типов:
Наиболее распространённый случай. Каждому уникальному значению соответствует отдельная форма.
Пример:
"shape": {
"field": "category",
"type": "nominal"
}
Используется реже, так как форма плохо подходит для передачи порядка. Однако Vega-Lite может сопоставить порядок с фиксированным списком символов.
"shape": {
"field": "rank",
"type": "ordinal"
}
Неподдерживаемый сценарий в чистом виде. Числа необходимо дискретизировать через биннинг или трансформации.
Канал shape может задаваться напрямую без поля
данных:
"shape": { "value": "triangle" }
Это приводит к тому, что все точки имеют одинаковую форму.
Для shape применяется дискретная шкала
(discrete scale), автоматически создаваемая Vega-Lite при
использовании поля nominal.
Каждому значению поля соответствует элемент легенды:
sort.Пример настройки:
"shape": {
"field": "group",
"type": "nominal",
"legend": { "title": "Группа данных" }
}
Vega использует фиксированный набор символов, которые можно указать строкой:
"circle""square""triangle-up""triangle-down""diamond""cross""star""wedge""triangle-right""triangle-left"Пример явного задания:
"shape": {
"value": "diamond"
}
Vega-Lite автоматически распределяет формы по категориям. Если категорий больше, чем доступных символов, начинается повторное использование форм, что может снижать читаемость.
Для контроля можно использовать scale.domain и
scale.range:
"shape": {
"field": "type",
"type": "nominal",
"scale": {
"domain": ["A", "B", "C"],
"range": ["circle", "square", "triangle"]
}
}
Канал shape редко используется изолированно. Его
эффективность возрастает при совместном использовании с другими
визуальными переменными.
"encoding": {
"shape": { "field": "group", "type": "nominal" },
"color": { "field": "group", "type": "nominal" }
}
Дублирование кодирования повышает различимость при дальтонизме или низком качестве отображения.
"encoding": {
"shape": { "field": "type", "type": "nominal" },
"size": { "field": "value", "type": "quantitative" }
}
Используется для разделения категорий при одновременном отображении числовой интенсивности.
Vega-Lite поддерживает условное кодирование:
"shape": {
"condition": {
"test": "datum.value > 50",
"value": "triangle"
},
"value": "circle"
}
Такое выражение позволяет динамически менять форму в зависимости от данных.
Перед применением shape часто используются трансформации
данных:
"transform": [
{
"bin": true,
"field": "value",
"as": "binned"
}
]
"transform": [
{
"aggregate": [{"op": "count", "as": "count"}],
"groupby": ["category"]
}
]
После трансформации результат может использоваться как категориальная
ось для shape.
Канал имеет ряд архитектурных ограничений:
symbol.type;Пример Vega (низкоуровневый):
{
"type": "symbol",
"encode": {
"enter": {
"shape": { "value": "square" }
}
}
}
Vega (но не Vega-Lite напрямую) позволяет использовать SVG path:
"shape": {
"value": "M0,-1L0.6,0.8L-0.6,0.8Z"
}
В Vega-Lite это возможно только через config или
post-compile изменения.
При большом количестве точек канал shape может влиять на
производительность:
Оптимизационные практики:
opacity вместо дополнительного
shape;color при больших наборах данных.Если значение поля отсутствует:
circle;null категорию.Явное управление:
"shape": {
"field": "category",
"type": "nominal",
"nullValue": "cross"
}
Канал shape сохраняется при интерактивных операциях:
interval,
point selection);Пример selection:
"selection": {
"picked": { "type": "single", "fields": ["category"] }
},
"encoding": {
"shape": {
"field": "category",
"type": "nominal"
},
"opacity": {
"condition": { "selection": "picked", "value": 1 },
"value": 0.3
}
}
Канал shape эффективно работает в ситуациях, где:
Он становится неэффективным при высокой плотности данных или при попытке кодировать непрерывные величины без предварительной дискретизации.