Визуализация на основе текста в Vega-Lite строится вокруг
специального типа примитива — текстового маркера
(mark: "text"), который позволяет отображать значения
данных не в виде геометрических фигур, а в виде строковых подписей,
чисел, вычисленных выражений или агрегированных результатов. Центральным
элементом управления выводом текста выступает канал text,
который определяет содержимое отображаемой надписи.
Текстовая визуализация в Vega-Lite описывается через стандартную структуру спецификации:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{ "category": "A", "value": 10 },
{ "category": "B", "value": 25 }
]
},
"mark": "text",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" },
"text": { "field": "value", "type": "quantitative" }
}
}
Ключевой момент заключается в том, что канал text
отвечает исключительно за содержимое подписи, в то время как
координатные каналы (x, y) определяют
позиционирование текста на графике.
Канал text в Vega-Lite представляет собой универсальный
механизм преобразования значений данных в строковое представление. Он
может принимать:
field)aggregate)calculate)format через
format и formatType)transform)"text": { "field": "value", "type": "quantitative" }
В этом случае значение отображается без изменения. Vega-Lite автоматически приводит число к строке.
Канал text поддерживает форматирование через параметр
format, который особенно важен при работе с количественными
данными.
"text": {
"field": "value",
"type": "quantitative",
"format": ".2f"
}
Формат .2f задаёт отображение числа с двумя знаками
после запятой. Форматирование основано на спецификации форматирования
чисел D3-format.
Примеры распространённых форматов:
.0f — целое число.2f — два знака после запятой.2% — процентное отображение, — разделение тысячКанал text часто используется совместно с агрегирующими
функциями, особенно в случаях, когда требуется отображение
статистических значений.
"text": {
"aggregate": "mean",
"field": "value",
"type": "quantitative"
}
В этом случае текстовое значение становится результатом вычисления среднего арифметического по группе данных.
Типичные агрегаты:
countsumaverage / meanminmaxmedianТекстовые метки часто используются как подписи групп:
{
"mark": "text",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"text": { "aggregate": "sum", "field": "value" }
}
}
В таких случаях текстовый канал становится инструментом представления сводных данных, а не отдельных наблюдений.
Для более гибких сценариев используется трансформация
calculate, позволяющая формировать строковые выражения.
{
"transform": [
{
"calculate": "'Значение: ' + datum.value",
"as": "label"
}
],
"mark": "text",
"encoding": {
"text": { "field": "label", "type": "nominal" }
}
}
В этом случае канал text отображает уже подготовленное
строковое поле.
Vega-Lite поддерживает два подхода:
field — обращение к даннымcalculate — вычисление нового поляВ более низкоуровневом Vega можно использовать выражения напрямую в
text, но в Vega-Lite это реализуется через
трансформации.
Через calculate можно реализовывать условное форматирование текста:
{
"transform": [
{
"calculate": "datum.value > 20 ? 'high' : 'low'",
"as": "level"
}
],
"mark": "text",
"encoding": {
"text": { "field": "level", "type": "nominal" }
}
}
Канал text в данном случае отображает категориальное
значение, вычисленное на основе условий.
Текст часто используется как дополнительный слой поверх графиков:
{
"layer": [
{
"mark": "bar",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" }
}
},
{
"mark": "text",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" },
"text": { "field": "value", "type": "quantitative" }
}
}
]
}
Такой подход позволяет накладывать числовые значения прямо на столбцы диаграммы.
Помимо канала text, важную роль играют параметры
визуального размещения:
align — горизонтальное выравнивание (left,
center, right)baseline — вертикальное выравнивание (top,
middle, bottom)dx, dy — смещение"mark": {
"type": "text",
"align": "center",
"baseline": "middle"
}
Эти параметры не влияют на содержимое text, но определяют его читаемость.
Если поле содержит null, канал text может
отображать пустую строку или быть заменён через transform:
{
"transform": [
{
"calculate": "isValid(datum.value) ? datum.value : 'N/A'",
"as": "label"
}
]
}
Таким образом обеспечивается устойчивость визуализации.
Для временных данных используется форматирование через
timeUnit и format:
"text": {
"field": "date",
"type": "temporal",
"timeUnit": "yearmonth"
}
Или более детально:
"text": {
"field": "date",
"type": "temporal",
"format": "%Y-%m-%d"
}
Текстовый канал в этом случае превращает временные значения в читаемые строки.
Типичный сценарий — отображение метрик:
{
"mark": "text",
"encoding": {
"text": {
"aggregate": "sum",
"field": "revenue",
"type": "quantitative",
"format": "$,.0f"
}
}
}
Такой подход применяется в дашбордах для вывода ключевых показателей без дополнительных графических элементов.
В Vega (низкоуровневой спецификации) текст задаётся через прямые выражения:
{
"type": "text",
"encode": {
"enter": {
"text": { "signal": "datum.value" }
}
}
}
В Vega-Lite канал text абстрагирует этот механизм,
предоставляя декларативное описание без необходимости работы с
сигналами.
x, y)
при использовании mark: textХотя канал text отвечает только за содержимое,
визуальный контекст можно дополнять:
"mark": {
"type": "text",
"color": "black",
"fontSize": 14
}
При необходимости цвет текста может зависеть от данных через encoding:
"color": { "field": "category", "type": "nominal" }
Канал text поддерживает строковые значения, но не
полноценную разметку. Для многострочного отображения используются
символы переноса строки:
"text": {
"field": "label"
}
где label может содержать \n.
Текстовый канал часто становится завершающим уровнем визуализации, где числовые и категориальные данные преобразуются в интерпретируемые подписи. Его использование позволяет формировать не только графическое представление данных, но и их семантическое сопровождение, превращая визуализацию в комбинированный информационный слой.