В спецификациях Vega и Vega-Lite генерация последовательностей используется как базовый механизм синтетического построения данных, позволяющий формировать упорядоченные числовые или временные ряды без внешнего источника. Концепция sequence применяется как на уровне данных, так и в составе трансформационных пайплайнов, обеспечивая детерминированное создание диапазонов значений для последующих вычислений, визуализаций и построения производных признаков.
В Vega-Lite последовательность чаще всего задаётся через специальный
источник данных sequence, который встроен в объект
data. Этот механизм формирует массив значений с равномерным
шагом.
Базовая структура:
{
data: {
sequence: {
start: 0,
stop: 10,
step: 1,
as: "x"
}
},
mark: "line",
encoding: {
x: { field: "x", type: "quantitative" },
y: { expression: "datum.x * datum.x" }
}
}
start
stop
step
as
Числовые sequence применяются для построения функций, тестовых распределений и визуализации математических зависимостей.
Пример генерации линейного диапазона:
{
data: {
sequence: {
start: 1,
stop: 100,
step: 1,
as: "n"
}
},
mark: "line",
encoding: {
x: { field: "n", type: "quantitative" },
y: { expression: "log(datum.n)" }
}
}
Такая конструкция используется для:
Sequence поддерживает работу с временными диапазонами, где
start и stop задаются в формате даты.
{
data: {
sequence: {
start: "2024-01-01",
stop: "2024-01-10",
step: 1,
as: "date"
}
},
mark: "line",
encoding: {
x: { field: "date", type: "temporal" },
y: { expression: "sin(datum.date)" }
}
}
Особенности временных sequence:
Sequence часто используется для построения искусственных датасетов, которые затем расширяются через transform-операции.
Пример генерации базовой сетки значений:
{
data: {
sequence: {
start: -5,
stop: 5,
step: 0.1,
as: "x"
}
},
transform: [
{
calculate: "datum.x * datum.x",
as: "y"
}
],
mark: "point",
encoding: {
x: { field: "x", type: "quantitative" },
y: { field: "y", type: "quantitative" }
}
}
Sequence здесь выступает как генератор домена функции, а transform формирует зависимую переменную.
В Vega (в отличие от Vega-Lite) sequence может использоваться как полноценный data source в Dataflow-системе спецификации:
{
data: [
{
name: "table",
values: { sequence: { start: 0, stop: 50, step: 5 } }
}
]
}
В Vega такая последовательность становится входным потоком, который далее проходит через:
Sequence особенно эффективно работает в связке с вычислительными трансформациями Vega-Lite.
{
data: {
sequence: {
start: 0,
stop: 20,
step: 1,
as: "x"
}
},
transform: [
{
calculate: "pow(2, datum.x)",
as: "y"
}
]
}
{
data: {
sequence: {
start: 0,
stop: 100,
step: 1,
as: "x"
}
},
transform: [
{
filter: "datum.x % 2 === 0"
}
]
}
Sequence в этом случае создаёт полный набор, после чего трансформация уменьшает его до нужного подмножества.
Sequence используется для дискретизации функций:
Генерация плотных сеток для аппроксимации:
Создание каркасов временных осей:
При комбинировании нескольких sequence формируется двумерная сетка:
{
data: {
sequence: {
start: 0,
stop: 10,
step: 1,
as: "x"
}
},
transform: [
{
calculate: "sequence(0,10,1)",
as: "yGrid"
}
]
}
(в Vega чаще реализуется через cross product или lookup, но концептуально sequence формирует ось)
Sequence всегда создаёт дискретный набор значений, даже при дробном шаге, что может приводить к:
Значение stop обычно не включается в результат, что
влияет на точность границ визуализации.
При больших диапазонах:
Sequence является частью декларативного подхода, в котором:
Это позволяет объединять:
Для построения сложных моделей часто используется несколько последовательностей:
Пример концептуальной модели:
{
data: {
sequence: {
start: 0,
stop: 10,
step: 0.5,
as: "x"
}
},
transform: [
{
calculate: "sin(datum.x)",
as: "y"
},
{
calculate: "cos(datum.x)",
as: "z"
}
]
}
Sequence часто выступает стартовой точкой графа вычислений:
Таким образом формируется поток: sequence → transform → encoding → mark
Этот поток лежит в основе большинства синтетических визуализаций Vega и Vega-Lite.