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 * stepstop (не включая
его)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"
}
]
}
Такой подход используется для синтетических временных осей без внешнего источника данных.
sequence редко используется изолированно. Его сила
раскрывается в связке с трансформациями.
{
"data": {
"sequence": {
"start": 0,
"stop": 6.28,
"step": 0.01,
"as": "x"
}
},
"transform": [
{
"calculate": "sin(datum.x)",
"as": "y"
}
]
}
Такой подход формирует дискретную аппроксимацию непрерывной функции.
sequence применяется не только для графиков функций, но
и для построения вспомогательных структур:
Пример сетки:
{
"data": {
"sequence": {
"start": 0,
"stop": 100,
"step": 10,
"as": "tick"
}
}
}
Меньший step увеличивает количество точек
экспоненциально по отношению к диапазону:
Практическое правило:
Граница stop не включается в результат, что важно при
точных диапазонах:
[start, stop) — полуоткрытый интервалstop при положительном
шагеЭто поведение критично при стыковке нескольких последовательностей.
sequenceЛюбая функция в Vega-Lite фактически отображается как:
sequencecalculateСтруктурно это можно рассматривать как простейший численный метод:
Без sequence данные должны поступать извне:
sequence заменяет эти источники в случаях, когда:
Несмотря на универсальность, sequence имеет
ограничения:
Эти ограничения компенсируются цепочкой transform.
x = f(t), y = g(t)
реализуется через:
sequence → tcalculate → x, ysequence часто синхронизируется с масштабами осей:
Это обеспечивает согласованность визуального пространства без ручного задания координат.
Внутри спецификации Vega-Lite sequence выполняет
роль:
Он снижает необходимость подготовки данных до уровня спецификации и переносит часть вычислений в декларативный слой визуализации.