В архитектуре Vega размер визуализации не является фиксированной характеристикой рендера — он становится частью реактивной системы сигналов. Ширина и высота в Vega представлены не просто числовыми параметрами, а полноценными сигналами, которые могут участвовать в вычислениях, зависимостях и динамическом обновлении представления.
Каждый сигнал в Vega — это именованное значение, которое может
изменяться во времени и автоматически триггерить перерасчёт зависимых
выражений. Сигналы width и height занимают
особое место: они определяют геометрию всего холста визуализации и
одновременно могут быть переопределены через выражения.
В Vega верхнеуровневые свойства width и
height могут быть заданы как:
Простейшая форма:
{
"width": 400,
"height": 300
}
Внутри системы это автоматически транслируется в сигналы:
{
"signals": [
{ "name": "width", "value": 400 },
{ "name": "height", "value": 300 }
]
}
Однако ключевая особенность Vega заключается в том, что эти значения не статичны — они могут быть реактивно переопределены.
Вместо чисел можно использовать выражения:
{
"width": "containerSize()[0]",
"height": "containerSize()[1]"
}
Здесь используется встроенный механизм сигналов:
containerSize() возвращает текущие размеры
контейнера[0] — ширина[1] — высотаТаким образом, визуализация становится адаптивной без необходимости ручного пересчёта layout.
В Vega сигналы образуют направленный граф зависимостей. Если
width зависит от другого сигнала, например:
{
"signals": [
{
"name": "padding",
"value": 20
},
{
"name": "width",
"update": "containerSize()[0] - padding * 2"
}
]
}
то любое изменение padding автоматически приводит к
пересчёту width.
width и height участвуют в
layout-движкеscale.range)axis)Ширина и высота напрямую участвуют в формировании диапазонов шкал.
Пример:
{
"scales": [
{
"name": "xscale",
"range": [0, { "signal": "width" }]
}
]
}
И аналогично:
{
"scales": [
{
"name": "yscale",
"range": [{ "signal": "height" }, 0]
}
]
}
Здесь важно, что height часто инвертируется (0 вверху),
что типично для SVG-координатной системы.
Сигналы позволяют изменять размеры визуализации в рантайме:
{
"signals": [
{
"name": "chartWidth",
"value": 400
},
{
"name": "width",
"update": "chartWidth"
}
]
}
Изменение chartWidth автоматически перестраивает:
Механизм autosize управляет тем, как Vega интерпретирует
width и height.
{
"autosize": "pad"
}
{
"autosize": "fit"
}
{
"autosize": "none"
}
При fit сигналы width и height
фактически становятся производными от контейнера.
Vega поддерживает привязку к событиям изменения окна:
{
"signals": [
{
"name": "width",
"on": [
{
"events": "window:resize",
"update": "containerSize()[0]"
}
]
}
]
}
Таким образом:
window:resizewidthВ Vega-Lite width и height задаются на
более высоком уровне абстракции и не описываются напрямую как сигналы в
пользовательской спецификации.
Пример Vega-Lite:
{
"width": "container",
"height": 300
}
или:
{
"width": 400,
"height": 300
}
При компиляции:
width и height в
сигналы Vegaautosize поведение{
"width": "container",
"height": "container"
}
Это эквивалентно:
width и height в Vega
runtimeРазмеры холста влияют на:
{
"mark": "bar",
"encoding": {
"x": { "field": "category" },
"y": { "field": "value" }
}
}
Если width увеличивается:
При дискретных шкалах:
{
"width": { "step": 20 }
}
Общая ширина вычисляется как:
Это создаёт обратную зависимость: не только width влияет
на данные, но и данные влияют на width.
Сигналы можно использовать в выражениях:
{
"signals": [
{
"name": "radius",
"update": "min(width, height) / 2"
}
]
}
Это особенно важно для:
Система вычислений обычно выглядит так:
Любое изменение на верхнем уровне распространяется вниз по графу зависимостей.
{
"signals": [
{
"name": "width",
"update": "height + 10"
},
{
"name": "height",
"update": "width - 10"
}
]
}
Такая конструкция создаёт замкнутый цикл и приводит к некорректному пересчёту.
{
"autosize": "none",
"width": 800
}
В этом случае визуализация перестаёт реагировать на контейнер, что часто ломает responsive layout.
Если width меняется, но шкалы фиксированы, возможны:
При проектировании визуализации важно учитывать, что
width и height — это не просто параметры, а
входные переменные всей системы визуального вычисления.
Они:
Именно поэтому в Vega архитектура размеров встроена в сигнальную систему, а не вынесена в отдельный слой конфигурации.