В спецификации Vega ключевая задача визуализации заключается в
преобразовании данных в визуальные переменные: координаты, размеры,
цвета, углы, прозрачность и другие визуальные характеристики.
Центральным механизмом этого преобразования выступает блок
scales.
scales задаёт функции отображения (mapping functions),
которые переводят значения данных в визуальные значения. В отличие от
императивных графических библиотек, где преобразования выполняются
вручную в коде, Vega описывает их декларативно.
Основная формула поведения scale:
Таким образом, scale является формальным мостом между данными и отрисовкой.
В Vega scales представляет собой массив объектов, каждый
из которых описывает отдельное преобразование:
Пример общей структуры:
"scales": [
{
"name": "xscale",
"type": "linear",
"domain": {"data": "table", "field": "value"},
"range": "width"
}
]
Каждый scale становится доступен через ссылки в marks,
axes и legends.
Vega поддерживает широкий набор типов шкал, каждый из которых соответствует определённому виду данных.
Линейное отображение числовых значений.
Используется для:
Поведение:
Логарифмическое преобразование.
Используется для:
Особенность:
Категориальная шкала.
Используется для:
Особенность:
Шкала для дискретных категорий с шириной полос.
Используется в:
Особенность:
Похожа на band, но без ширины — только координаты
точек.
Используется для:
Шкалы для временных данных.
Используются для:
Различие:
time учитывает локальное времяutc работает в универсальном времениdomain определяет, какие значения данных участвуют в
преобразовании.
Варианты задания:
"domain": {"data": "table", "field": "price"}
Vega автоматически вычисляет:
"domain": [0, 100]
Используется для:
"domain": {
"data": "table",
"field": "value",
"sort": true
}
Позволяет контролировать порядок категорий.
"domain": {
"fields": [
{"data": "a", "field": "x"},
{"data": "b", "field": "x"}
]
}
Используется при объединении данных из разных таблиц.
range задаёт пространство, в которое отображаются
значения domain.
"range": [0, 500]
"range": "width"
или
"range": "height"
Используется для автоматической привязки к размерам визуализации.
"range": ["#ff0000", "#00ff00"]
или палитры:
"range": {"scheme": "category10"}
Для цветовых и числовых шкал возможна интерполяция:
"interpolate": "rgb"
Поддерживаемые режимы:
Особенность:
Для band и point шкал применяются
параметры:
"padding": 0.1
"paddingInner": 0.05
"paddingOuter": 0.2
Функциональность:
"reverse": true
Инвертирует отображение:
Используется для:
"clamp": true
Ограничивает выходные значения диапазоном range.
Поведение:
"zero": true
Добавляет автоматическое включение нулевой точки в domain.
Используется для:
Особенность:
"nice": true
Автоматически округляет границы domain:
Используется для:
В Vega часто используется несколько шкал одновременно:
Пример композиции:
"scales": [
{
"name": "xscale",
"type": "linear",
"domain": {"data": "table", "field": "x"},
"range": "width"
},
{
"name": "yscale",
"type": "linear",
"domain": {"data": "table", "field": "y"},
"range": "height"
},
{
"name": "color",
"type": "ordinal",
"domain": {"data": "table", "field": "category"},
"range": {"scheme": "tableau10"}
}
]
Шкалы напрямую используются в marks:
"x": {"scale": "xscale", "field": "value"}
или
"fill": {"scale": "color", "field": "type"}
Принцип:
Vega позволяет комбинировать scale с выражениями:
"x": {"scale": "xscale", "expr": "datum.value * 2"}
Это расширяет функциональность шкал:
При большом объёме данных важны следующие аспекты:
Оптимизационные практики:
В спецификациях Vega шкалы могут:
Пример:
В Vega-Lite scales также присутствуют, но:
Vega предоставляет полный контроль, тогда как Vega-Lite — декларативную абстракцию поверх этих механизмов.
Математически scale можно представить как функцию:
f: domain → range
где:
Каждый тип scale определяет:
Это делает scales фундаментальным уровнем всей архитектуры Vega-визуализаций.