Vega представляет декларативную грамматику визуализации, в которой линейные графики описываются через структуру данных, масштабирование и правила отрисовки, а не через императивное рисование на canvas или SVG. В этой модели линия рассматривается как набор упорядоченных точек, соединённых в соответствии с заданной семантикой оси X.
Vega-Lite упрощает описание линейных графиков, предоставляя компактную спецификацию, где большая часть низкоуровневых деталей (scales, axes, marks) генерируется автоматически.
Линейный график в Vega/Vega-Lite строится вокруг трёх ключевых компонентов:
В декларативной модели линия не существует как объект сама по себе — она выводится из набора точек, отсортированных по оси X.
Линейный график чаще всего начинается с такой структуры:
{
"data": {
"values": [
{"x": 1, "y": 10},
{"x": 2, "y": 25},
{"x": 3, "y": 18}
]
},
"mark": "line",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"}
}
}
В этом случае:
mark: "line" задаёт тип геометрииx определяет порядок соединения точекy задаёт значение функцииЛиния в Vega/Vega-Lite чувствительна к порядку точек. При отсутствии явного указания сортировки возможны искажения формы графика.
Корректное управление порядком:
"encoding": {
"x": {
"field": "x",
"type": "quantitative",
"sort": "ascending"
}
}
Сортировка особенно критична при:
Наиболее частый кейс — отображение времени как непрерывной оси.
{
"data": {
"values": [
{"date": "2024-01-01", "value": 30},
{"date": "2024-01-02", "value": 45},
{"date": "2024-01-03", "value": 40}
]
},
"mark": "line",
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": "value", "type": "quantitative"}
}
}
Тип temporal активирует:
В Vega доступна настройка формы соединения точек через
interpolate.
Основные варианты:
linear — прямые отрезкиmonotone — сглаживание без пересеченийbasis — B-сплайновая криваяstep — ступенчатая функцияПример:
{
"mark": {
"type": "line",
"interpolate": "monotone"
}
}
Выбор интерполяции влияет не только на эстетику, но и на интерпретацию данных: сглаживание может скрывать локальные экстремумы.
Линейные графики часто отображают несколько наборов данных через группировку.
{
"mark": "line",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"color": {"field": "category", "type": "nominal"}
}
}
Поле color автоматически:
Каждая категория становится отдельной линией в одном пространстве координат.
При наличии пропусков данные могут разрываться или интерполироваться.
В Vega-Lite:
"mark": {
"type": "line",
"strokeDash": [5, 5]
}
Но поведение по пропускам задаётся через null
обработку:
null → разрыв линииVega/Vega-Lite поддерживает встроенные трансформации перед отрисовкой:
"transform": [
{
"aggregate": [{"op": "mean", "field": "value", "as": "avg"}],
"groupby": ["date"]
}
]
Это позволяет строить усреднённые линии поверх сырых данных.
"transform": [
{"filter": "datum.value > 0"}
]
Фильтрация часто используется для устранения шумов или некорректных значений.
Линия полностью зависит от шкал координат.
Используется по умолчанию для числовых данных:
"x": {"type": "quantitative", "scale": {"type": "log"}}
Применяется при:
Оси определяют визуальную интерпретацию линии.
"axis": {
"title": "Время",
"grid": true,
"labelAngle": -45
}
Ключевые элементы:
При тысячах точек возникают проблемы:
Решения:
imputeVega позволяет восстанавливать недостающие значения:
"transform": [
{
"impute": "value",
"key": "x",
"method": "value",
"value": 0
}
]
Импутация влияет на непрерывность линии и может искажать реальные данные, если используется некорректно.
Линия часто комбинируется с точками:
"layer": [
{
"mark": "line"
},
{
"mark": "point"
}
]
Это усиливает читаемость:
Для разделения линий по панелям используется facet:
{
"facet": {"field": "category", "type": "nominal"},
"spec": {
"mark": "line",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"}
}
}
}
Каждая категория получает отдельный график.
В отличие от area chart, линейные графики:
Попытка имитировать stacking требует предварительной трансформации данных через cumulative sum.
Vega предоставляет контроль над визуальными параметрами:
stroke — цвет линииstrokeWidth — толщинаstrokeDash — пунктирopacity — прозрачностьПример:
"mark": {
"type": "line",
"strokeWidth": 2,
"strokeDash": [2, 2]
}
Если X категориальный:
Поэтому критично задавать:
"sort": ["category"]
Основные факторы влияния:
Оптимизация:
Линия концептуально представляет собой:
Вся логика формируется комбинацией: