В Vega шкала (scale) представляет собой функцию отображения, преобразующую значения из доменного пространства данных (domain) в пространство визуализации (range). Ключевая особенность архитектуры Vega заключается в том, что шкалы являются именованными объектами, которые существуют независимо от визуальных элементов (marks) и могут переиспользоваться.
Именованная шкала — это шкала, которой явно присвоено уникальное имя, используемое для связи с маркерами, осями и легендами.
Основные свойства такого подхода:
В спецификации Vega шкалы определяются в разделе scales
на верхнем уровне JSON-спеки. Каждая шкала представляет собой объект с
обязательным полем name.
Пример базового объявления:
{
"scales": [
{
"name": "xScale",
"type": "linear",
"domain": { "data": "table", "field": "value" },
"range": "width"
}
]
}
domain определяет, какие данные попадают в шкалу. В Vega
возможны три основных способа задания:
"domain": { "data": "table", "field": "value" }
Шкала автоматически вычисляет минимальное и максимальное значение поля.
"domain": [0, 100]
Используется фиксированный числовой диапазон.
"domain": { "signal": "domainValues" }
Позволяет динамически изменять диапазон через сигналы.
Связь между данными и визуальными примитивами осуществляется через указание имени шкалы в encoding каналах.
Пример использования в прямоугольниках:
{
"marks": [
{
"type": "rect",
"from": { "data": "table" },
"encode": {
"enter": {
"x": { "scale": "xScale", "field": "value" },
"width": { "scale": "xScale", "value": 10 }
}
}
}
]
}
Здесь ключевым моментом является:
“scale”: “xScale” — явная ссылка на именованную шкалу.
Это означает, что Vega не создаёт новую шкалу автоматически, а использует уже определённую.
В Vega шкалы часто используются для построения координатных систем:
Пример двухосевой системы:
"scales": [
{
"name": "xScale",
"type": "band",
"domain": { "data": "table", "field": "category" },
"range": "width"
},
{
"name": "yScale",
"type": "linear",
"domain": { "data": "table", "field": "value" },
"range": "height"
}
]
Одним из ключевых преимуществ именованных шкал является их переиспользование в нескольких mark-слоях.
Пример:
{
"marks": [
{
"type": "rect",
"from": { "data": "bars" },
"encode": {
"enter": {
"x": { "scale": "xScale", "field": "category" },
"y": { "scale": "yScale", "field": "value" }
}
}
},
{
"type": "text",
"from": { "data": "bars" },
"encode": {
"enter": {
"x": { "scale": "xScale", "field": "category" },
"y": { "scale": "yScale", "field": "value" },
"text": { "field": "value" }
}
}
}
]
}
В этом случае:
xScale используется и для геометрии, и для
текста;В Vega оси (axes) напрямую связаны со шкалами. Каждая
ось ссылается на именованную шкалу через поле scale.
{
"axes": [
{
"scale": "xScale",
"orient": "bottom"
},
{
"scale": "yScale",
"orient": "left"
}
]
}
Особенность архитектуры:
Для категориальных или цветовых шкал используется связь с легендами:
{
"legends": [
{
"fill": "colorScale"
}
]
}
Шкала colorScale может быть определена как:
{
"name": "colorScale",
"type": "ordinal",
"domain": { "data": "table", "field": "category" },
"range": ["red", "blue", "green"]
}
Таким образом:
Vega позволяет управлять шкалами через сигналы
(signals), что делает именованные шкалы реактивными.
Пример:
{
"signals": [
{
"name": "maxValue",
"value": 100
}
],
"scales": [
{
"name": "yScale",
"type": "linear",
"domain": [0, { "signal": "maxValue" }],
"range": "height"
}
]
}
Изменение maxValue приводит к автоматическому пересчёту
шкалы.
В сложных визуализациях шкалы часто разделяются по слоям, но при этом остаются именованными и совместимыми.
Типичный сценарий:
Важно, что именование позволяет явно контролировать:
Если несколько шкал используют одно имя, поведение становится неопределённым:
Если шкала используется повторно, но домены рассчитаны по разным данным, возникает визуальная несогласованность.
Использование, например, band шкалы как числовой в
линейных вычислениях приводит к искажению визуализации.
Если mark не указывает scale, Vega может создать неявную
шкалу, что ломает архитектурную предсказуемость.
Одна шкала может использоваться в нескольких независимых визуальных блоках, обеспечивая единый масштаб восприятия.
Vega поддерживает обратное отображение через invert:
{
"name": "yScale",
"type": "linear",
"domain": [0, 100],
"range": "height"
}
И затем:
"yScale": { "invert": 50 }
Позволяет получать исходное значение из координаты.
Шкалы могут использовать результаты других шкал или сигналов:
Именованные шкалы формируют основу архитектуры Vega, обеспечивая строгую декомпозицию между данными, преобразованиями и визуальными слоями, где каждая шкала становится независимым, переиспользуемым и явно адресуемым компонентом визуальной системы.