Vega рассматривает текст как полноценный графический примитив,
равноправный с геометрическими маркерами. В рамках декларативной модели
визуализации текстовый маркер (text mark) описывается через
данные, каналы кодирования и набор визуальных свойств, определяющих
отображение строк, чисел и вычисляемых значений прямо в области
графика.
Vega-Lite предоставляет упрощённый слой над Vega, где текстовые
подписи чаще всего генерируются через mark: "text" или
через производные конструкции (label, tooltip,
encoding.text). Несмотря на упрощение, базовая модель
остаётся идентичной: каждая строка текста — результат отображения одной
или нескольких строк данных.
Текстовый маркер в Vega/Vega-Lite представляет собой объект, который:
encodeКлючевая особенность — текст не является статическим слоем, а полностью управляется данными.
В Vega описание текстового маркера включает type: "text"
внутри массива marks:
{
"marks": [
{
"type": "text",
"from": { "data": "table" },
"encode": {
"enter": {
"x": { "scale": "xscale", "field": "x" },
"y": { "scale": "yscale", "field": "y" },
"text": { "field": "label" },
"fill": { "value": "black" }
}
}
}
]
}
Канал text определяет содержимое, отображаемое на
экране. Он может быть:
"text": { "field": "name" }
"text": { "expr": "datum.value + ' units'" }
"text": { "field": "value", "format": ".2f" }
Форматирование особенно важно для статистических визуализаций, где требуется контроль точности отображения.
Текстовый маркер всегда привязан к координатам:
x, y — базовые координатыdx, dy — смещениеalign — горизонтальное выравниваниеbaseline — вертикальное выравнивание"align": { "value": "center" }
Возможные значения:
leftcenterright"baseline": { "value": "middle" }
topmiddlebottomalphabeticКомбинация этих параметров позволяет точно позиционировать подписи относительно точек данных, осей и геометрических объектов.
Текстовый маркер поддерживает широкий набор визуальных свойств:
"font": { "value": "Arial" },
"fontSize": { "value": 14 }
"fontWeight": { "value": "bold" },
"fontStyle": { "value": "italic" }
"fill": { "value": "#333" },
"opacity": { "value": 0.8 }
"angle": { "value": 45 }
Поворот часто используется для подписей осей или плотных категориальных шкал.
В Vega-Lite текстовые элементы чаще всего задаются декларативно:
{
"mark": "text",
"encoding": {
"x": { "field": "category", "type": "ordinal" },
"y": { "field": "value", "type": "quantitative" },
"text": { "field": "label" }
}
}
Здесь отсутствует низкоуровневая структура encode.enter,
но логика остаётся той же.
Vega-Lite способен автоматически рассчитывать позиции текста при использовании композитных визуализаций.
Пример: подписи на столбчатой диаграмме
{
"data": { "values": [
{"cat": "A", "val": 10},
{"cat": "B", "val": 20}
]},
"mark": "bar",
"encoding": {
"x": {"field": "cat", "type": "nominal"},
"y": {"field": "val", "type": "quantitative"}
},
"layer": [
{
"mark": "bar"
},
{
"mark": "text",
"encoding": {
"x": {"field": "cat"},
"y": {"field": "val"},
"text": {"field": "val"}
}
}
]
}
Текстовая прослойка (layer) используется для наложения
подписей поверх графических объектов.
В Vega/Vega-Lite перенос строк задаётся символом \n:
"text": { "value": "Первая строка\nВторая строка" }
Для динамических данных:
"text": {
"expr": "datum.title + '\\n' + datum.subtitle"
}
Ограничения:
Текст может зависеть от вычислений:
"text": { "signal": "datum.value > 10 ? 'high' : 'low'" }
"text": { "field": "value", "format": ".1%" }
Используется D3-style форматирование.
Vega поддерживает реактивные сигналы:
"signals": [
{
"name": "threshold",
"value": 50
}
]
"text": {
"expr": "datum.value > threshold ? 'OK' : 'LOW'"
}
Текст обновляется при изменении сигналов без пересборки визуализации.
Часто текстовые значения формируются через трансформации:
"transform": [
{
"type": "formula",
"as": "label",
"expr": "datum.name + ': ' + datum.value"
}
]
Затем:
"text": { "field": "label" }
"transform": [
{
"type": "aggregate",
"groupby": ["category"],
"fields": ["value"],
"ops": ["sum"],
"as": ["total"]
}
]
В сложных сценах текст используется как слой аннотаций:
Пример структуры:
"layer": [
{ "mark": "line" },
{ "mark": "point" },
{ "mark": "text" }
]
Порядок слоёв определяет перекрытие.
Текстовый рендеринг в Vega зависит от SVG или Canvas:
Ограничения:
| Характеристика | Vega | Vega-Lite |
|---|---|---|
| Уровень контроля | низкоуровневый | декларативный |
| encode | полный доступ | скрыт |
| layer | вручную | автоматизирован |
| форматирование | выражения | сокращённые опции |
| интерактивность | полная | ограниченная |
Текст в Vega часто выполняет роль не просто подписи, а самостоятельного канала информации:
Это делает text mark равноправным элементом визуальной
грамматики, а не вспомогательным слоем.
Сложные интерфейсы формируются через комбинации:
text + symboltext + line annotationtext + background rectПример:
{
"mark": {
"type": "text",
"dx": 5,
"dy": -5
}
}
Такая композиция используется для смещения подписей относительно точек данных.
Основные факторы влияния:
exprОптимизации:
transformexprlimit через фильтрацию данныхАннотационные системы строятся на текстовых маркерах:
Такие элементы создаются через отдельные datasets и фильтрацию:
"transform": [
{ "type": "filter", "expr": "datum.value > 100" }
]
Текстовый маркер интегрирован в общую систему визуальных каналов:
Эта трёхуровневая модель делает текст не внешним слоем, а полноценной частью визуального кодирования данных, одинаково важной с геометрическими примитивами и трансформациями.