Математические функции

Математические функции в системе выражений Vega представляют собой основу вычислительного слоя, встроенного в спецификации визуализаций. Они используются внутри сигналов, вычисляемых полей (transforms), шкал, а также в логике условных выражений. В Vega-Lite доступ к ним осуществляется через transform calculate, который компилируется в выражения Vega.


Система выражений Vega

Язык выражений Vega основан на безопасном подмножестве JavaScript-подобного синтаксиса. Он поддерживает:

  • арифметические операции (+, -, *, /, %)
  • математические функции
  • логические выражения
  • условные конструкции
  • работу с датами и строками

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


Базовые арифметические функции

Абсолютное значение

Функция:

abs(x)

Возвращает модуль числа.

Пример:

{"expr": "abs(datum.value)"}

Используется для нормализации отклонений, расчёта расстояний и симметричных метрик.


Округление

round(x)
floor(x)
ceil(x)
  • round — математическое округление
  • floor — вниз
  • ceil — вверх

Пример:

{"expr": "floor(datum.price)"}

Визуальные применения:

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

Ограничение диапазона

clamp(x, min, max)

Функция фиксирует значение внутри интервала.

Пример:

{"expr": "clamp(datum.value, 0, 100)"}

Используется для:

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

Тригонометрические функции

Поддерживаются стандартные функции, работающие в радианах.

Основные функции

sin(x)
cos(x)
tan(x)

Пример генерации волны:

{"expr": "sin(datum.x * 0.1) * 50"}

Обратные функции

asin(x)
acos(x)
atan(x)
atan2(y, x)

Особое значение имеет atan2, позволяющая вычислять угол вектора:

{"expr": "atan2(datum.y, datum.x)"}

Используется в:

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

Экспоненциальные и логарифмические функции

Экспонента

exp(x)

Возвращает ( e^x ).

Применение:

  • моделирование роста
  • сглаживание анимаций
{"expr": "exp(datum.value / 10)"}

Логарифмы

log(x)
log10(x)

Используются для:

  • логарифмических шкал
  • сжатия динамического диапазона

Пример:

{"expr": "log(datum.value)"}

Степенные функции

pow(x, y)

Возведение в степень.

Пример:

{"expr": "pow(datum.value, 2)"}

Типичные сценарии:

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

Минимум, максимум и агрегирующие функции

Базовые функции

min(a, b, ...)
max(a, b, ...)

Пример:

{"expr": "max(datum.a, datum.b)"}

Генерация диапазонов

extent(array)

Возвращает [min, max].

Используется в:

  • вычислении доменов шкал
  • автонастройке осей

Условные математические выражения

Условная функция

if(condition, valueTrue, valueFalse)

Пример:

{"expr": "if(datum.value > 0, datum.value, 0)"}

Применяется для:

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

Работа с числами и преобразования типов

Проверка числовых значений

isValid(x)

Позволяет исключить null и NaN.

{"expr": "isValid(datum.value) ? datum.value : 0"}

Преобразование типов

toNumber(x)

Используется при обработке строковых данных:

{"expr": "toNumber(datum.value)"}

Геометрические вычисления

Расстояние

sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2))

В Vega часто выражается через композицию:

{"expr": "sqrt(pow(datum.x1 - datum.x2, 2) + pow(datum.y1 - datum.y2, 2))"}

Применение:

  • кластеризация точек
  • force-directed графы
  • heatmap-расчёты

Работа со шкалами и математические преобразования

В Vega математические функции часто комбинируются со шкалами:

{
  "expr": "scale('x', datum.value) + sin(datum.value * 0.1) * 10"
}

Здесь происходит смешивание:

  • линейного отображения через шкалу
  • нелинейного смещения через тригонометрию

Выражения в Vega-Lite

В Vega-Lite математические функции не используются напрямую в спецификации визуализации. Вместо этого применяется transform:

{
  "calculate": "sin(datum.x * 0.2) * 50",
  "as": "y"
}

Типовая структура calculate

{
  "transform": [
    {
      "calculate": "pow(datum.value, 2) + 10",
      "as": "computed"
    }
  ]
}

После компиляции Vega-Lite преобразует выражение в полноценный Vega expression.


Композиция математических функций

Сложные выражения строятся через вложенность:

{"expr": "clamp(sin(datum.x) * 100 + pow(datum.y, 2), 0, 500)"}

Характерные паттерны:

  • нормализация + тригонометрия
  • логарифмирование + масштабирование
  • условные ограничения + степенные функции

Оптимизация вычислений выражений

Математические функции в Vega выполняются интерпретатором выражений, поэтому важны:

  • минимизация вложенности
  • исключение повторных вычислений
  • предварительная агрегация данных в transforms

Пример упрощения:

До:

{"expr": "pow(datum.x, 2) + pow(datum.x, 2)"}

После:

{"expr": "2 * pow(datum.x, 2)"}

Области применения математических функций

Визуализация распределений

  • логарифмические преобразования
  • нормализация
  • сглаживание

Геометрические графики

  • расстояния
  • углы
  • координатные преобразования

Анимации

  • синусоидальные колебания
  • экспоненциальные затухания

Интерактивные сигналы

  • ограничение значений
  • условные переключения
  • динамические вычисления

Синтаксические особенности выражений

  • выражения являются строками
  • отсутствуют циклы
  • нет пользовательских функций
  • вычисления происходят реактивно
  • доступ к данным через datum

Пример контекста:

{"expr": "datum.value * sin(signal('time') * 0.01)"}

Интеграция с сигналами и данными

Математические функции работают как над данными, так и над сигналами:

{"expr": "sin(signal('mouseX') * 0.05)"}

Это позволяет строить интерактивные модели, где математика управляет визуальным состоянием напрямую.