Масштаб (scale) в визуализации представляет собой преобразование данных из исходного домена значений в диапазон пикселей, цветов или других визуальных параметров. В контексте слоёв именно поведение масштабов определяет, насколько согласованными или независимыми будут визуальные элементы разных графических слоёв.
В Vega-Lite слоистая композиция (layer) опирается на
единый принцип: каждый слой может либо использовать общие шкалы, либо
переопределять их локально через механизм разрешения
(resolve). Это делает систему одновременно строгой и
гибкой, позволяя строить как единые координатные пространства, так и
комбинированные визуализации с различными шкалами.
Слоистая структура в Vega-Lite предполагает, что несколько визуальных представлений данных накладываются друг на друга в одном координатном пространстве. Каждый слой — это самостоятельная декларация encoding, но по умолчанию они разделяют общие шкалы.
Если не указано иное, все слои:
x и
yЭто поведение обеспечивает когерентность визуализации: точки, линии и области интерпретируются в единой системе координат.
Общие шкалы означают, что все слои используют один и тот же объект
scale для конкретного канала (например, x, y,
color).
{
"data": { "url": "data.csv" },
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "time", "type": "temporal" },
"y": { "field": "valueA", "type": "quantitative" }
}
},
{
"mark": "point",
"encoding": {
"x": { "field": "time", "type": "temporal" },
"y": { "field": "valueA", "type": "quantitative" }
}
}
]
}
Оба слоя используют одинаковые шкалы времени и значений, что гарантирует точное совпадение точек и линии.
Независимые шкалы используются, когда разные слои не должны интерпретировать данные в одном масштабе. Это особенно важно при:
В Vega-Lite независимость шкал задаётся через
resolve.
Ключевая конструкция управления шкалами в слоях:
"resolve": {
"scale": {
"x": "shared",
"y": "independent"
}
}
Возможные значения:
"shared" — общая шкала для всех слоёв"independent" — отдельная шкала для каждого слояx: sharedy: sharedЧастый сценарий — сравнение величин с разными диапазонами.
{
"data": { "url": "data.csv" },
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "temperature", "type": "quantitative" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "humidity", "type": "quantitative" }
}
}
],
"resolve": {
"scale": {
"y": "independent"
}
}
}
Здесь каждая линия получает собственную шкалу Y, предотвращая искажение одной переменной из-за диапазона другой.
Шкалы цвета особенно чувствительны к конфликтам доменов, особенно при наложении категориальных и количественных данных.
"resolve": {
"scale": {
"color": "independent"
}
}
Это позволяет каждому слою иметь собственную цветовую интерпретацию.
Полная независимость достигается через отключение всех общих шкал:
"resolve": {
"scale": {
"x": "independent",
"y": "independent",
"color": "independent"
}
}
Такой подход фактически превращает слои в несколько независимых графиков, совмещённых в одном холсте.
Домены шкал определяют, какие значения отображаются.
При общих шкалах домен формируется как объединение всех слоёв:
Каждый слой вычисляет домен отдельно, что приводит к:
Неверный выбор между shared и independent может приводить к:
Особенно критично это для:
В реальных визуализациях часто используется гибрид:
"resolve": {
"scale": {
"x": "shared",
"y": "independent",
"color": "shared"
}
}
Такой подход позволяет:
В Vega модель шкал реализована более низкоуровнево. Каждый scale — это отдельный объект с явным описанием:
В Vega-Lite эти детали абстрагируются, а управление сводится к
декларативному resolve.
Выбор между shared и independent определяется структурой данных:
При компиляции спецификации Vega-Lite происходит:
Если один слой использует:
и шкала объявлена как shared, система:
Разные mark-типы по-разному реагируют на шкалы: