В композиционных спецификациях Vega-Lite (layer, concat, facet,
repeat) несколько визуализаций могут сосуществовать в одном графике, при
этом каждая из них потенциально определяет собственные шкалы (scales),
оси (axes) и легенды (legends). Ключевая задача механизма
resolve — определить, какие из этих компонентов будут
разделяемыми (shared), а какие — независимыми
(independent) для каждой дочерней визуализации.
Без явного управления разрешением Vega-Lite применяет набор эвристик,
которые могут приводить к неожиданному поведению в сложных компоновках.
Поэтому resolve является центральным инструментом контроля
согласованности координатных систем.
resolveВ спецификации композиции объект resolve описывается на
уровне контейнера:
{
"resolve": {
"scale": {},
"axis": {},
"legend": {}
}
}
Каждое поле управляет соответствующим типом визуального компонента:
scale — разрешение шкал (x, y, color и т.д.)axis — поведение осей (ticks, labels, grid)legend — поведение легенд для закодированных полейШкалы определяют отображение данных в координатное пространство. В композиции Vega-Lite одна и та же шкала может:
Для каждой шкалы можно задать:
"shared" — единая шкала для всех дочерних
представлений"independent" — отдельная шкала для каждого
представленияПример:
{
"resolve": {
"scale": {
"y": "shared",
"color": "independent"
}
}
}
При использовании "shared":
Это критично для:
При "independent":
Типичный случай применения:
Оси в Vega-Lite связаны со шкалами, но имеют собственные параметры: подписи, сетку, деления, форматирование.
{
"resolve": {
"axis": {
"x": "shared",
"y": "independent"
}
}
}
При shared:
Особенно важно в:
При independent:
Легенды отображают соответствие между данными и визуальными кодировками (например, цветами или формами).
{
"resolve": {
"legend": {
"color": "shared"
}
}
}
При shared:
Это важно для:
При independent:
В layer все слои обычно используют общие шкалы,
поскольку они находятся в одной координатной системе:
{
"layer": [
{ "mark": "line", "encoding": { "y": { "field": "a", "type": "quantitative" } } },
{ "mark": "point", "encoding": { "y": { "field": "b", "type": "quantitative" } } }
],
"resolve": {
"scale": {
"y": "shared"
}
}
}
Здесь shared y-шкала обеспечивает корректное наложение линий и точек.
При concat каждая панель может быть как независимой, так
и синхронизированной:
{
"concat": [
{ "mark": "bar", "encoding": { "x": { "field": "a" } } },
{ "mark": "bar", "encoding": { "x": { "field": "b" } } }
],
"resolve": {
"scale": {
"x": "independent"
}
}
}
Это позволяет сравнивать формы распределений без привязки к абсолютным значениям.
Facet создаёт набор повторяющихся подграфиков. Здесь
resolve особенно критичен:
{
"facet": {
"row": { "field": "category", "type": "nominal" }
},
"spec": {
"mark": "line",
"encoding": {
"x": { "field": "year", "type": "temporal" },
"y": { "field": "value", "type": "quantitative" }
}
},
"resolve": {
"scale": {
"y": "shared"
},
"axis": {
"x": "shared"
}
}
}
Shared y-шкала обеспечивает сопоставимость категорий, а shared x-ось синхронизирует временную шкалу.
При вычислении итоговой визуализации Vega-Lite использует следующий порядок:
resolveВажно, что resolve всегда переопределяет автоматические
решения.
В композициях часто возникают конфликты:
Если две панели используют shared шкалу, но данные имеют
сильно разные диапазоны, происходит:
Решение:
independentЕсли один слой использует quantitative, а другой nominal шкалу цвета:
При попытке объединить несовместимые оси:
Решается через:
"axis": {
"x": "shared"
}
или отключением осей на уровне одного слоя:
"axis": null
resolve со
структурой VegaНа более низком уровне Vega (не Vega-Lite) используется концепция
resolve в group marks:
scaleaxislegendVega-Lite транслирует декларативные настройки в Vega runtime, где:
При проектировании сложных визуализаций важно учитывать:
Типовые паттерны:
При использовании интерактивных трансформаций (filter, brush, zoom):
Это влияет на:
Эти ошибки приводят к: