Поле datum представляет текущую строку данных в момент
вычисления выражений, трансформаций и визуальных правил. В Vega и
Vega-Lite оно используется как универсальный доступ к значениям
исходного набора данных, позволяя выполнять привязку логики визуализации
к конкретным полям без предварительной агрегации или внешних
переменных.
Внутренняя модель Vega основана на потоковой обработке записей.
Каждая запись данных при прохождении через трансформации и отрисовку
графических примитивов становится объектом, доступным через
datum.
datum всегда соответствует одной строке исходного или
промежуточного набора данных в текущем контексте:
mark encoding — текущая визуальная сущность (точка,
прямоугольник, линия);transform — текущая обрабатываемая запись;Структура обращения всегда строится через точечную нотацию:
datum.fieldName
или через доступ к вложенным структурам:
datum["nested"]["value"]
datum не является глобальной переменной. Его значение
определяется исключительно текущим контекстом исполнения:
Каждое выражение, использующее datum, выполняется
построчно, что позволяет строить декларативные правила без явного
цикла.
datumПривязка к конкретному значению реализуется через прямое сравнение
полей datum с константами или вычисляемыми выражениями.
Такой подход позволяет фиксировать условия на уровне отдельных записей
данных.
datum.value > 10
Здесь значение поля value каждой записи сравнивается с
фиксированным числом.
datum.category == "A"
Такая конструкция фиксирует визуальную или вычислительную логику на конкретной категории данных.
datum.value > 10 && datum.category == "A"
Логические операторы позволяют формировать сложные ограничения на уровне одной записи.
Фильтрация является одним из основных сценариев применения
datum. В Vega-Lite это реализуется через трансформацию
filter.
{
"data": {"values": [
{"x": 1, "y": 5},
{"x": 2, "y": 15},
{"x": 3, "y": 8}
]},
"transform": [
{
"filter": "datum.y > 10"
}
],
"mark": "point",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"}
}
}
Фильтр применяет выражение к каждой записи, исключая те, для которых условие ложно.
filter: "datum.y > 10 && datum.x < 5"
Такие выражения позволяют формировать выборки без изменения исходного набора данных.
datumВ трансформации calculate datum
используется для построения производных полей.
{
"transform": [
{
"calculate": "datum.x + datum.y",
"as": "sum"
}
]
}
Каждая запись получает новое поле sum, вычисленное на
основе исходных значений текущего datum.
datum.metrics.sales / datum.metrics.count
Подобный доступ применяется для сложных JSON-структур, где данные имеют иерархическую организацию.
datum широко используется для условного форматирования
визуальных элементов.
{
"mark": "circle",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"color": {
"condition": {
"test": "datum.y > 10",
"value": "red"
},
"value": "blue"
}
}
}
Каждый визуальный элемент получает цвет в зависимости от значения конкретной записи.
size: {
"condition": "datum.value > 100",
"value": 200,
"else": 50
}
Логика привязана к текущему datum, что позволяет
дифференцировать элементы без агрегации.
В чистом Vega datum применяется в expressions более
гибко, чем в Vega-Lite.
"expr": "datum.a * datum.b"
или в transform:
{
"type": "formula",
"as": "product",
"expr": "datum.a * datum.b"
}
datum с внешними значениямиХотя datum относится к текущей записи данных, он часто
сравнивается с внешними параметрами или сигналами.
datum.value > 50
{
"params": [
{"name": "threshold", "value": 10}
],
"transform": [
{
"filter": "datum.y > threshold"
}
]
}
В этом случае datum сохраняет локальный контекст, а
threshold выступает внешним управляющим значением.
При работе с реальными наборами данных часто встречаются отсутствующие поля.
datum.value != null
datum.a && datum.a.b
или
datum["a"] && datum["a"]["b"]
Такие конструкции предотвращают ошибки при обращении к отсутствующим структурам.
Каждый mark в Vega фактически привязан к одному datum.
Это обеспечивает прямое соответствие между данными и графическим
представлением.
{
"mark": "circle",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"color": {
"condition": "datum.y > 0",
"value": "green"
}
}
}
Каждая точка интерпретируется как независимый datum, а
визуальные свойства вычисляются локально.
datum в
агрегацияхПосле применения агрегирующих трансформаций datum
начинает представлять уже агрегированную запись.
Пример:
{
"aggregate": [
{"op": "mean", "field": "value", "as": "avg"}
],
"groupby": ["category"]
}
После такой операции:
datum.category — группа;datum.avg — агрегированное значение.Привязка через datum всегда локальна и детерминирована
текущей записью:
Такой подход обеспечивает воспроизводимость визуализаций и предсказуемость вычислений в pipeline обработки данных.