В Vega-Lite и Vega ось (axis) является одним из ключевых механизмов визуального кодирования данных, связывающим числовые или категориальные значения с координатным пространством. Ось не существует как самостоятельная сущность вне масштаба (scale) и канала (encoding), а формируется как результат их взаимодействия, где поле данных становится визуально интерпретируемым через шкалу и отображается посредством разметки оси.
В Vega-Lite ось возникает прежде всего в контексте каналов
x и y внутри encoding. Именно эти
каналы автоматически порождают визуальные оси при использовании
непрерывных или порядковых шкал.
Классическая структура выглядит следующим образом:
{
"mark": "bar",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" }
}
}
Здесь:
x формирует категориальную ось;y формирует количественную ось;Важно, что ось не задаётся напрямую как axis в корне
спецификации. Она является частью описания канала через объект
axis внутри encoding.
Поле axis — это расширенная конфигурация оси,
позволяющая управлять её внешним видом и поведением.
Пример:
{
"encoding": {
"x": {
"field": "date",
"type": "temporal",
"axis": {
"title": "Дата",
"format": "%Y-%m",
"labelAngle": -45
}
}
}
}
Объект axis применяется к конкретному каналу и влияет
только на отображение соответствующей оси.
Поле title задаёт текст, описывающий смысл шкалы.
"axis": {
"title": "Выручка (в тыс.)"
}
Если title не указан, Vega-Lite может использовать имя
поля или генерировать заголовок автоматически.
Свойство format управляет отображением числовых и
временных значений.
Для количественных данных используется форматирование в стиле d3-format:
"axis": {
"format": ".2f"
}
Для временных данных применяется формат d3-time-format:
"axis": {
"format": "%d.%m.%Y"
}
Форматирование особенно важно при плотных шкалах, где значения необходимо сжимать без потери читаемости.
Поле labelAngle управляет поворотом текстовых меток:
"axis": {
"labelAngle": -90
}
Типичные значения:
Используется для предотвращения наложения текста при большом количестве категорий.
Свойство grid включает или отключает линии сетки:
"axis": {
"grid": true
}
Сетка обычно активна для количественных осей, так как помогает визуально соотносить значения с позициями на графике.
tickCount задаёт желаемое количество делений:
"axis": {
"tickCount": 5
}
Фактическое число может отличаться, так как Vega-Lite оптимизирует разметку.
Свойство ticks позволяет полностью включить или
отключить деления:
"axis": {
"ticks": false
}
Используются для числовых данных. Поддерживают интерполяцию шкалы.
Характерные особенности:
"y": {
"field": "price",
"type": "quantitative",
"axis": { "title": "Цена" }
}
Оси времени адаптируются под диапазон данных: дни, месяцы, годы.
"x": {
"field": "timestamp",
"type": "temporal",
"axis": {
"format": "%H:%M"
}
}
Особенность заключается в автоматической адаптации интервалов: при расширении диапазона изменяется уровень детализации.
Используются для дискретных значений.
"x": {
"field": "product",
"type": "nominal"
}
Такие оси:
Ось может располагаться с разных сторон визуализации. Хотя в
Vega-Lite это часто определяется автоматически, можно явно
контролировать ориентацию через axis.orient:
"axis": {
"orient": "top"
}
Возможные значения:
bottomtopleftrightЭто особенно важно при комбинированных визуализациях.
Vega-Lite позволяет создавать многослойные графики, где одна и та же область содержит несколько осей.
Пример с двумя количественными шкалами:
{
"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" }
}
}
]
}
В таких случаях возникает вопрос синхронизации осей. Vega-Lite может:
axis и
scale.Ограничивает длину текста меток:
"axis": {
"labelLimit": 50
}
Длинные значения обрезаются с добавлением многоточия.
Управляет поведением при наложении подписей:
"axis": {
"labelOverlap": true
}
Автоматические стратегии включают:
Хотя домен (domain) формально относится к
scale, его взаимодействие с осью критично.
"scale": {
"domain": [0, 100]
}
Ось при этом отражает фиксированный диапазон, а не вычисленный из данных.
В Vega (в отличие от Vega-Lite) ось задаётся явно в разделе
axes:
{
"axes": [
{
"orient": "bottom",
"scale": "xscale",
"title": "Время"
}
]
}
Здесь:
scale связывает ось с конкретной шкалой;Vega-Lite:
encoding;Vega:
При использовании трансформаций (transform) ось всегда
строится на основе уже обработанных данных:
"transform": [
{ "filter": "datum.value > 0" }
]
Это означает, что:
При использовании bin ось становится
дискретизированной:
"x": {
"field": "age",
"bin": true,
"type": "quantitative"
}
Результат:
Ось выполняет не только техническую функцию отображения шкалы, но и семантическую роль:
Без корректной настройки axis даже корректные данные могут быть визуально искажены, поскольку восприятие шкалы напрямую зависит от плотности, формата и структуры делений.