Vega и Vega-Lite поддерживают механизм именованных стилей (named
styles), который реализуется через поле style в описании
графических примитивов и через секцию конфигурации
config.style. Этот механизм служит для многократного
переиспользования визуальных параметров без дублирования кода и
позволяет строить иерархию оформления поверх базовых настроек
mark-типа.
Поле style задаёт именованный набор визуальных правил,
который применяется к mark-элементу поверх базового описания
mark.
В общем виде:
{
"type": "circle",
"style": "highlight"
}
или множественные стили:
{
"type": "circle",
"style": ["highlight", "emphasis"]
}
mark и
encodingИменованные стили объявляются в секции config.style. Это
центральный механизм переиспользования визуальных правил.
{
"config": {
"style": {
"highlight": {
"fill": "orange",
"stroke": "black",
"strokeWidth": 2
},
"muted": {
"opacity": 0.3
}
}
}
}
{
"data": { "url": "data.csv" },
"mark": "circle",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" }
},
"style": "highlight"
}
Система стилей в Vega/Vega-Lite строится как каскад:
mark-тип (например, circle)config.markconfig.style.<name>encoding (имеет приоритет над визуальными атрибутами
mark)Таким образом, style работает как промежуточный слой
между глобальной темой и конкретной визуализацией.
Несколько стилей применяются последовательно:
{
"mark": "point",
"style": ["interactive", "selected"]
}
{
"config": {
"style": {
"interactive": {
"cursor": "pointer",
"fillOpacity": 0.8
},
"selected": {
"stroke": "red",
"strokeWidth": 3
}
}
}
}
interactive добавляет интерактивные визуальные
свойстваselected переопределяет обводкуVega-Lite использует style как высокоуровневый механизм
тематизации. Он интегрирован в компиляцию спецификации в Vega.
Особенности:
Vega предоставляет более низкоуровневый контроль:
style напрямую влияет на marksВ Vega-Lite стили часто используются для создания дизайн-системы визуализаций.
{
"config": {
"style": {
"axis-style": {
"labelFontSize": 12,
"titleFontSize": 14
},
"chart-primary": {
"fill": "#4C78A8"
},
"chart-secondary": {
"fill": "#F58518"
}
}
}
}
Применение:
{
"mark": "bar",
"style": "chart-primary"
}
Система стилей подчиняется строгим правилам приоритета.
encoding (максимальный приоритет)styleconfig.mark{
"mark": {
"type": "circle",
"color": "blue"
},
"style": "highlight",
"encoding": {
"color": { "value": "green" }
}
}
Результат:
highlightМеханизм именованных стилей часто применяется для моделирования состояний:
{
"config": {
"style": {
"hover": {
"fill": "red",
"strokeWidth": 2
}
}
}
}
{
"config": {
"style": {
"inactive": {
"opacity": 0.2
}
}
}
}
{
"mark": "point",
"style": "inactive"
}
В многослойных визуализациях style позволяет
централизованно управлять визуальной иерархией.
{
"layer": [
{
"mark": { "type": "line", "style": "series" }
},
{
"mark": { "type": "point", "style": "highlight" }
}
]
}
Механизм именованных стилей решает задачу разделения:
| Механизм | Область | Назначение |
|---|---|---|
mark |
локальный | конкретная диаграмма |
config.mark |
глобальный | дефолт для всех marks |
config.style |
тематический | именованные наборы стилей |
style |
связующий | выбор темы для mark |
Стилевые группы могут использоваться как строительные блоки тем:
{
"config": {
"style": {
"base": {
"font": "sans-serif"
},
"dark": {
"fill": "#222",
"stroke": "#eee"
},
"accent": {
"fill": "#ffcc00"
}
}
}
}
Комбинирование:
{
"mark": "rect",
"style": ["base", "dark", "accent"]
}
Если style указывает на несуществующее имя:
В крупных системах визуализации style становится
механизмом:
Типичный паттерн:
Механизм style усиливает декларативность:
Это позволяет отделять намерение визуализации от её исполнения на уровне runtime системы Vega.