Поле marks: иерархия и типы

В спецификациях Vega и Vega-Lite поле mark определяет тип графического примитива, которым визуализируются данные. Это центральный элемент декларативной модели: именно он связывает данные с их визуальным воплощением.

В Vega-Lite mark задаёт высокоуровневую семантику («что рисовать»), а в Vega трансформируется в низкоуровневые графические примитивы (marks), управляемые сценографом (scenegraph). Несмотря на различие уровней абстракции, концептуально система marks строится вокруг единой идеи: каждый визуальный объект — это mark с набором свойств и данных.


Иерархия marks в Vega-Lite

В Vega-Lite marks организованы не как плоский список, а как иерархическая структура, где один визуал может включать вложенные композиции:

1. Верхнеуровневые marks

Это основные типы визуализации:

  • bar
  • line
  • area
  • point
  • circle
  • square
  • rect
  • tick
  • rule
  • text
  • geoshape

Каждый из них задаёт базовую геометрическую интерпретацию данных.

Пример:

{
  "mark": "bar"
}

Здесь вся визуализация интерпретируется как набор прямоугольников.


2. Композиционные marks

Композиционные конструкции формируют иерархию визуализаций:

  • layer — наложение нескольких marks
  • facet — разбиение данных на подграфики
  • repeat — повторение одной схемы
  • concat — последовательное размещение графиков
  • resolve — управление масштабами и осями между слоями

Эти конструкции формируют дерево визуализации, где каждый узел может содержать собственный mark.

Пример слоя:

{
  "layer": [
    { "mark": "line" },
    { "mark": "point" }
  ]
}

Иерархия здесь выглядит так:

Layer
 ├── Line mark
 └── Point mark

3. Вложенные marks и facet-структура

facet создаёт подграфики, каждый из которых имеет собственный набор marks.

{
  "facet": {
    "row": { "field": "category", "type": "nominal" }
  },
  "spec": {
    "mark": "bar"
  }
}

Иерархия:

Facet (разбиение по category)
 ├── Bar chart (category A)
 ├── Bar chart (category B)
 └── Bar chart (category C)

Каждый подграфик — самостоятельный mark-дерево.


Типы marks и их семантика

Геометрические marks

point

Используется для отображения дискретных наблюдений.

  • Представляет координатную точку
  • Может кодировать дополнительные каналы: цвет, размер, форма
{ "mark": "point" }

Применяется в scatter plot и как дополнение к линиям.


circle и square

Специализированные версии point с фиксированной формой.

  • circle — круги
  • square — квадраты

Часто используются для улучшения читаемости плотных данных.


bar

Один из ключевых marks в Vega-Lite.

  • отображает величины через длину/высоту прямоугольника
  • требует ось категорий и количественную шкалу

Иерархически bar часто выступает как корневой mark в простых визуализациях.


line

Используется для непрерывных данных.

  • соединяет точки по порядку
  • требует сортировки по оси X

Внутренне представляет последовательность соединённых line segments.


area

Расширение line, где область под линией закрашивается.

  • строится как замкнутый path
  • часто комбинируется с прозрачностью и слоями

rect

Базовый прямоугольный примитив.

  • используется в heatmap
  • часто в сложных композициях (trellis, matrix)

rule

Линия-ориентир:

  • вертикальные или горизонтальные линии
  • используется для средних значений, порогов

tick

Краткая метка на оси:

  • компактная альтернатива bar/point
  • часто применяется для распределений

text

Позволяет отображать подписи.

  • привязан к координатам
  • поддерживает форматирование текста

geoshape

Специализированный mark для геоданных.

  • работает с GeoJSON
  • используется в картографических визуализациях

Иерархия marks в Vega (низкоуровневая модель)

В Vega marks представлены как узлы scenegraph и имеют более сложную структуру:

1. Root scenegraph

Вся визуализация начинается с root group mark:

group (root)
 ├── axes
 ├── legends
 └── data marks

2. Group marks

Group mark — ключевой элемент иерархии:

  • содержит другие marks
  • управляет трансформациями (scale, translate)
  • реализует вложенные координатные системы

3. Primitive marks

Базовые графические элементы:

  • rect
  • symbol
  • path
  • text
  • arc

Они не содержат вложенности, но могут быть частью group.


Вложенность и трансформации marks

Marks могут находиться в различных контекстах трансформации:

1. Spatial hierarchy

Каждый уровень может иметь:

  • собственную систему координат
  • масштабирование
  • смещение
Group A
 └── Group B (shifted)
     └── Marks

2. Data hierarchy

Marks могут быть связаны с разными уровнями данных:

  • root dataset
  • facet subset
  • transformed dataset (aggregate/filter)

3. Encoding hierarchy

Каждый mark получает encoding:

  • x, y
  • color
  • size
  • shape

Encoding может переопределяться на уровне слоя или фасета.


Layered marks: принцип композиции

layer в Vega-Lite формирует стек визуальных слоёв:

  • каждый слой — независимый mark
  • слои рисуются последовательно
  • верхний слой перекрывает нижний

Типичная структура:

Layer
 ├── Area (background)
 ├── Line (trend)
 └── Point (observations)

Это создаёт мультимарковую систему поверх одной шкалы.


Repeat marks и шаблонная иерархия

repeat создаёт повторяющиеся mark-структуры:

  • один шаблон mark
  • несколько экземпляров с разными полями данных

Иерархия:

Repeat container
 ├── Mark instance 1
 ├── Mark instance 2
 └── Mark instance 3

Resolve: управление конфликтами marks

В композициях marks возникает необходимость согласования:

  • scale
  • axis
  • legend

resolve управляет этим поведением:

  • shared scales
  • independent scales
  • explicit overrides

Это влияет на визуальную иерархию, но не на структуру данных.


Поведенческая модель marks

Marks в Vega-Lite обладают декларативной реактивностью:

  • изменение данных → пересчёт marks
  • изменение encoding → перерисовка слоя
  • изменение структуры → перестройка scenegraph

Внутренне система пересобирает дерево marks, а не изменяет отдельные элементы точечно.


Связь marks с данными и трансформациями

Marks не существуют отдельно от data pipeline:

  • transform изменяет входные данные
  • mark отображает результат трансформации
  • encoding связывает поля с визуальными каналами

Типичный поток:

Data → Transform → Encoding → Mark → Scenegraph

Иерархия marks как дерево визуализации

Обобщённая структура:

Spec
 ├── Composition (layer/facet/repeat)
 │    ├── Subspec
 │    │    ├── Mark
 │    │    └── Encoding
 │    └── Subspec
 └── Resolve rules

Это дерево является основой всей декларативной модели визуализации в Vega-Lite и компилируется в scenegraph Vega.