Визуальный канал shape используется для кодирования категориальных данных через форму графического маркера. В отличие от цвета или размера, форма обладает высокой устойчивостью к восприятию и позволяет различать категории даже при монохромной печати или ограниченной палитре.
В экосистеме Vega и Vega-Lite shape реализуется по-разному:
point и канал
shapesymbol с полем
shapeКлючевая идея заключается в том, что shape не является числовым измерением и не предполагает упорядоченности.
В Vega-Lite shape применяется только к точечным маркерам:
{
"data": { "url": "data.csv" },
"mark": "point",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" },
"shape": { "field": "category", "type": "nominal" }
}
}
Здесь:
x, y задают положениеcategory определяет форму точкиКаждому уникальному значению категории автоматически сопоставляется форма из набора символов.
Vega/Vega-Lite поддерживают фиксированный набор символов:
circlesquarecrossdiamondtriangle-uptriangle-downtriangle-righttriangle-leftstrokeКаждый символ соответствует заранее определённой геометрии, реализованной через SVG path.
Пример явного задания shape:
{
"mark": "point",
"encoding": {
"shape": {
"field": "group",
"type": "nominal",
"scale": {
"domain": ["A", "B", "C"],
"range": ["circle", "square", "triangle-up"]
}
}
}
}
Scale для shape играет ключевую роль в управлении визуальной дифференциацией категорий.
"shape": {
"field": "type",
"type": "nominal",
"scale": {
"range": [
"circle",
"square",
"diamond",
"triangle-up",
"cross"
]
}
}
Особенности:
Legend автоматически отражает соответствие:
Пример настройки легенды:
"shape": {
"field": "series",
"type": "nominal",
"legend": {
"title": "Серии данных",
"symbolLimit": 8
}
}
Параметр symbolLimit ограничивает количество
отображаемых элементов легенды, что важно при большом числе
категорий.
Shape-символы можно дополнительно стилизовать через свойства mark:
{
"mark": {
"type": "point",
"filled": true,
"size": 120,
"stroke": "#333",
"strokeWidth": 1
}
}
Ключевые параметры:
size — площадь символаfilled — заливка формыstroke — цвет обводкиstrokeWidth — толщина линииВажно учитывать, что shape влияет только на форму, но не заменяет контроль размера и цвета.
Shape особенно полезен в layered-графиках:
{
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" }
}
},
{
"mark": "point",
"encoding": {
"x": { "field": "x" },
"y": { "field": "y" },
"shape": { "field": "group", "type": "nominal" },
"color": { "field": "group", "type": "nominal" }
}
}
]
}
В этом случае:
В Vega shape задаётся через mark symbol:
{
"type": "symbol",
"from": { "data": "table" },
"encode": {
"enter": {
"x": { "field": "x" },
"y": { "field": "y" },
"shape": { "value": "diamond" },
"size": { "value": 100 }
}
}
}
Дополнительно shape может быть вычисляемым:
"shape": { "field": "category" }
И применяться через scale:
"scales": [
{
"name": "shapeScale",
"type": "ordinal",
"domain": { "data": "table", "field": "category" },
"range": ["circle", "square", "triangle-up"]
}
]
Использование shape подчиняется ограничениям визуального восприятия:
В scatter plot shape часто используется для борьбы с визуальным слиянием точек:
"mark": {
"type": "point",
"opacity": 0.7,
"filled": true
}
Vega поддерживает расширение через пользовательские символы:
{
"shape": "M0,-1L1,1L-1,1Z"
}
Это SVG path, позволяющий:
При большом количестве точек:
shape почти не влияет на производительность по
сравнению с colorНаиболее устойчивые комбинации:
Менее удачные: