В системах декларативной визуализации Vega-Lite и Vega ключевую роль играет понятие типа данных. Тип определяет семантику поля, правила агрегации, допустимые преобразования и поведение шкал (scales), а также влияет на автоматический выбор визуальных кодировок.
В Vega-Lite тип задаётся явно через свойство type в
описании поля encoding. В Vega тип данных чаще выводится через
преобразования (transform) и сигналы, однако логика
интерпретации остаётся схожей.
Основные типы данных:
Каждый тип определяет поведение шкал:
Пример декларации в Vega-Lite:
{
"data": {"url": "data.csv"},
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"field": "value", "type": "quantitative"}
}
}
Здесь category интерпретируется как дискретный набор
значений, а value — как числовая ось.
Если тип не указан явно, Vega-Lite пытается вывести его автоматически на основе структуры данных:
Однако автоматическое определение не всегда корректно. Например, числовые идентификаторы могут быть ошибочно интерпретированы как количественные значения, хотя семантически являются номинальными.
В Vega ключевым механизмом управления интерактивностью являются сигналы (signals). Сигнал — это реактивная переменная, которая может управлять параметрами визуализации.
Каждый сигнал имеет начальное значение (initial value), определяющее состояние до взаимодействий пользователя или поступления событий.
Пример сигнала:
{
"signals": [
{
"name": "threshold",
"value": 10
}
]
}
Здесь value задаёт начальное значение сигнала
threshold.
Если значение не задано, сигнал может:
Тип сигнала в Vega не задаётся явно, но фактически определяется контекстом выражения:
Пример числового сигнала:
{
"signals": [
{
"name": "opacity",
"value": 0.5
}
]
}
Пример булевого сигнала:
{
"signals": [
{
"name": "showLabels",
"value": true
}
]
}
В Vega-Lite интерактивность реализуется через selections и parameters. В них также присутствует понятие начального состояния.
{
"selection": {
"brush": {
"type": "interval",
"init": {
"x": [100, 200]
}
}
}
}
Здесь init задаёт начальное состояние выделения,
определяя стартовый диапазон.
{
"params": [
{
"name": "alpha",
"value": 0.7
}
]
}
Свойство value выступает как начальное значение
параметра.
Параметры в Vega-Lite не требуют явного указания типа, но их поведение определяется контекстом использования:
Пример использования параметра:
{
"params": [
{
"name": "minValue",
"value": 20
}
],
"transform": [
{
"filter": "datum.value > minValue"
}
]
}
Здесь начальное значение minValue влияет на фильтрацию
данных с момента загрузки визуализации.
В обеих системах существуют неявные начальные состояния:
value могут стартовать как
undefinedinit начинаются в пустом состоянииЭто поведение критично для декларативной природы системы: визуализация должна строиться даже при минимальном описании.
Тип данных напрямую влияет на допустимость и интерпретацию начального значения:
{
"data": {"url": "sales.csv"},
"params": [
{
"name": "year",
"value": 2023
}
],
"mark": "line",
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": "revenue", "type": "quantitative"}
},
"transform": [
{"filter": "year(datum.date) == year"}
]
}
Здесь:
temporal тип определяет работу с датойquantitative задаёт числовую осьyear имеет начальное значение 2023В Vega реактивность построена на пересчёте зависимостей:
Таким образом, начальное значение выступает не просто параметром, а частью вычислительной модели визуализации.
Тип данных определяет не только визуальное отображение, но и поведение шкал:
Начальное значение параметров может влиять на:
Тип в Vega-Lite выполняет функцию контрактного описания:
Начальное значение, в свою очередь, фиксирует стартовое состояние этого контракта, определяя поведение визуализации до любых внешних воздействий.