Визуализация данных в Vega и Vega-Lite опирается на преобразование исходных значений в экранные координаты. Центральную роль в этом процессе выполняют шкалы (scales), которые задают отображение между доменом данных и диапазоном отображения.
Шкала формализуется как функция преобразования:
В Vega выражениях scale() используется как функция
доступа к зарегистрированной шкале. Она выполняет преобразование
значения через заранее определённую конфигурацию масштаба.
Базовая форма:
scale("имя_шкалы", значение)
Пример:
scale("xscale", datum.value)
В этом случае:
"xscale" — идентификатор шкалы, определённой в секции
scalesdatum.value — входное значениеФункция scale() не является математической функцией в
чистом виде. Она представляет собой интерфейс к объекту масштабирования,
который включает:
Внутри Vega выражение:
scale("x", 10)
эквивалентно вызову внутреннего преобразования:
xScale(10) → вычисленное значение диапазона
Domain задаёт множество значений, которые поступают на вход шкалы. В Vega и Vega-Lite domain может быть:
{
"domain": [0, 100]
}
Отображает значения от 0 до 100.
{
"domain": {"data": "table", "field": "value"}
}
В этом случае границы вычисляются из набора данных.
Для linear:
Для ordinal:
{
"type": "ordinal",
"domain": ["A", "B", "C"]
}
Для time:
Range задаёт, во что преобразуются значения domain.
Типичные диапазоны:
{
"range": [0, 500]
}
Значения domain отображаются в пиксельный диапазон.
{
"range": ["red", "blue"]
}
Используется для градиентных или категориальных цветовых шкал.
{
"range": [0, 10, 20, 30]
}
Каждому элементу domain сопоставляется фиксированное значение range.
Математически шкала реализует отображение:
f: domain → range
Для линейной шкалы:
f(x) = rangeStart + (x - domainStart) * k
где:
k = (rangeEnd - rangeStart) / (domainEnd - domainStart)
genui{“math_block_widget_always_prefetch_v2”:{“content”:“f(x)=r_0 + (x-d_0)”}}
В Vega-Lite шкалы задаются декларативно через encoding и
scale.
Пример линейной шкалы:
{
"mark": "point",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"scale": {
"domain": [0, 100],
"range": [0, 400]
}
}
}
}
Если domain не задан, Vega-Lite вычисляет его
автоматически:
{
"x": {
"field": "value",
"type": "quantitative"
}
}
Поведение:
Band scale используется для дискретных категорий с шириной полос:
{
"type": "band",
"domain": ["A", "B", "C"],
"range": [0, 300]
}
Особенности:
{
"type": "time",
"domain": ["2024-01-01", "2024-12-31"],
"range": [0, 800]
}
Особенности:
В Vega expressions scale() применяется не только к осям,
но и к любым визуальным свойствам:
scale("x", datum.value)
scale("color", datum.category)
scale("size", datum.metric)
Одна визуализация может содержать несколько шкал:
Каждая шкала имеет собственные domain и range.
domain и range сохраняются, но добавляется функция преобразования:
f(x) = log(x)
f(x) = √x
f(x) = x^p
Эти функции влияют на распределение значений внутри range.
При включённом clamp: true значения вне domain
ограничиваются краями range:
Это предотвращает выход графики за пределы области отображения.
Часто шкалы используются для нормализации:
value_normalized = (value - domain_min) / (domain_max - domain_min)
x_{norm}=
После нормализации применяется range-масштабирование.
Для категорий:
Отображение:
A → 0
B → 1
C → 2
или
A → red
B → green
C → blue
В Vega-Lite domain может автоматически расширяться:
Пример:
{
"scale": {
"padding": 10
}
}
Padding влияет на фактический диапазон range.
Шкала в Vega и Vega-Lite реализует трёхкомпонентную модель:
Вызов scale() выполняет применение этой модели к
конкретному значению, обеспечивая согласованное отображение данных в
координатах, цветах и других визуальных свойствах.