Поле sequence: генерация числовых рядов

Vega-Lite предоставляет встроенный механизм генерации данных без внешних источников — data generator sequence. Он используется для построения числовых рядов, которые затем применяются в визуализациях: от тестовых шкал и сеток до параметрических графиков функций и дискретных моделей.

Vega включает аналогичную концепцию на уровне более низкоуровневых спецификаций, однако в Vega-Lite sequence реализован как декларативный генератор внутри блока data, что делает его особенно удобным для компактных графиков и учебных примеров.


Базовая структура генератора sequence

Генерация последовательности задаётся внутри data:

{
  "data": {
    "sequence": {
      "start": 0,
      "stop": 10,
      "step": 1,
      "as": "x"
    }
  }
}

Ключевые параметры

start Начальное значение последовательности (включительно).

stop Конечное значение (не включается в результат).

step Шаг изменения между значениями.

as Имя поля, в которое будет записано значение.


Поведение генерации

Последовательность формируется как арифметический ряд:

  • каждый следующий элемент вычисляется как start + n * step
  • генерация прекращается при достижении stop (не включая его)
  • направление определяется знаком step

Пример:

"sequence": {
  "start": 1,
  "stop": 6,
  "step": 1,
  "as": "x"
}

Результат:

1, 2, 3, 4, 5

Использование в визуализации функций

Наиболее частый сценарий — генерация оси X для математических функций.

Линейная функция

{
  "data": {
    "sequence": {
      "start": 0,
      "stop": 10,
      "step": 0.1,
      "as": "x"
    }
  },
  "transform": [
    {
      "calculate": "2 * datum.x + 1",
      "as": "y"
    }
  ]
}

В этом примере sequence создаёт равномерную сетку значений, а calculate строит зависимую переменную.


Построение непрерывных кривых

Квадратичная функция

{
  "data": {
    "sequence": {
      "start": -10,
      "stop": 10,
      "step": 0.2,
      "as": "x"
    }
  },
  "transform": [
    {
      "calculate": "datum.x * datum.x",
      "as": "y"
    }
  ]
}

Чем меньше step, тем более гладкой становится кривая, поскольку увеличивается плотность дискретизации.


Отрицательные шаги и обратные последовательности

sequence поддерживает отрицательные значения step, что позволяет генерировать убывающие ряды.

{
  "data": {
    "sequence": {
      "start": 10,
      "stop": 0,
      "step": -1,
      "as": "x"
    }
  }
}

Результат:

10, 9, 8, ..., 1

Важно учитывать, что направление определяется совместимостью start, stop и step. Некорректная комбинация приводит к пустому набору данных.


Генерация временных и псевдотемпоральных рядов

Хотя sequence предназначен для чисел, его часто используют для имитации времени через преобразования.

{
  "data": {
    "sequence": {
      "start": 0,
      "stop": 24,
      "step": 1,
      "as": "hour"
    }
  },
  "transform": [
    {
      "calculate": "utc(2024, 0, 1, datum.hour)",
      "as": "time"
    }
  ]
}

Такой подход используется для синтетических временных осей без внешнего источника данных.


Комбинация с другими transform

sequence редко используется изолированно. Его сила раскрывается в связке с трансформациями.

Синусоида

{
  "data": {
    "sequence": {
      "start": 0,
      "stop": 6.28,
      "step": 0.01,
      "as": "x"
    }
  },
  "transform": [
    {
      "calculate": "sin(datum.x)",
      "as": "y"
    }
  ]
}

Такой подход формирует дискретную аппроксимацию непрерывной функции.


Использование для сеток и шкал

sequence применяется не только для графиков функций, но и для построения вспомогательных структур:

  • деления осей
  • grid-lines
  • маркеры интервалов
  • тестовые диапазоны данных

Пример сетки:

{
  "data": {
    "sequence": {
      "start": 0,
      "stop": 100,
      "step": 10,
      "as": "tick"
    }
  }
}

Влияние шага на производительность

Меньший step увеличивает количество точек экспоненциально по отношению к диапазону:

  • высокая точность графика
  • рост нагрузки на рендеринг
  • увеличение размера dataset

Практическое правило:

  • визуализация функций: 100–1000 точек
  • интерактивные графики: ограничение плотности через масштабирование
  • аналитические сетки: шаг кратный диапазону

Особенности вычисления границ

Граница stop не включается в результат, что важно при точных диапазонах:

  • [start, stop) — полуоткрытый интервал
  • последний элемент всегда меньше stop при положительном шаге

Это поведение критично при стыковке нескольких последовательностей.


Дискретизация функций через sequence

Любая функция в Vega-Lite фактически отображается как:

  1. генерация области определения через sequence
  2. вычисление значения функции через calculate
  3. визуализация через mark (line, area, point)

Структурно это можно рассматривать как простейший численный метод:

  • равномерная сетка (uniform sampling)
  • табличное вычисление значений
  • визуальная интерполяция

Сравнение с альтернативными источниками данных

Без sequence данные должны поступать извне:

  • JSON
  • CSV
  • API
  • inline datasets

sequence заменяет эти источники в случаях, когда:

  • данные синтетические
  • требуется математическая модель
  • нужна регулярная сетка значений

Ограничения генератора

Несмотря на универсальность, sequence имеет ограничения:

  • только равномерные шаги
  • отсутствует адаптивная дискретизация
  • нет встроенных условий генерации
  • не поддерживает нелинейные интервалы без transform

Эти ограничения компенсируются цепочкой transform.


Паттерны использования

1. Параметрический график

x = f(t), y = g(t)

реализуется через:

  • sequence → t
  • calculate → x, y

2. Функциональная визуализация

  • sequence → domain
  • calculate → f(x)

3. Сетка значений

  • sequence → ticks
  • filter → выбор подмножества

Взаимодействие с масштабами

sequence часто синхронизируется с масштабами осей:

  • domain xScale = sequence range
  • domain yScale = derived values

Это обеспечивает согласованность визуального пространства без ручного задания координат.


Практическая роль в архитектуре Vega-Lite

Внутри спецификации Vega-Lite sequence выполняет роль:

  • встроенного генератора данных
  • инструмента тестирования визуализаций
  • основы для процедурных графиков

Он снижает необходимость подготовки данных до уровня спецификации и переносит часть вычислений в декларативный слой визуализации.