Диаграмма Ганта представляет собой способ визуализации временных интервалов задач на временной шкале. Основная структура диаграммы основана на горизонтальных отрезках, где каждая полоса соответствует задаче, а её длина отражает продолжительность. В контексте Vega и Vega-Lite диаграмма Ганта реализуется через комбинацию временных шкал, геометрических примитивов и преобразований данных.
Базовая модель данных включает набор задач с временными границами:
Пример структуры данных:
[
{
"task": "Проектирование",
"start": "2026-01-01",
"end": "2026-01-10",
"group": "Фаза 1"
},
{
"task": "Разработка",
"start": "2026-01-11",
"end": "2026-02-01",
"group": "Фаза 2"
}
]
Временные значения интерпретируются как даты, что требует
использования шкалы типа temporal.
Диаграмма Ганта в Vega-Lite строится через комбинацию:
bar для отображения интерваловПростейшая спецификация:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"task": "Проектирование", "start": "2026-01-01", "end": "2026-01-10"},
{"task": "Разработка", "start": "2026-01-11", "end": "2026-02-01"}
]
},
"mark": "bar",
"encoding": {
"y": {"field": "task", "type": "nominal"},
"x": {"field": "start", "type": "temporal"},
"x2": {"field": "end"}
}
}
Ключевой механизм — использование x2, определяющего
конечную границу интервала. Именно этот параметр превращает обычный
столбец в временной отрезок.
Для корректного отображения временных интервалов используется временная шкала:
yearmonthdate)yearweek)yearmonth)yearmonthdatehoursminutesseconds)Настройка оси:
"x": {
"field": "start",
"type": "temporal",
"axis": {"format": "%d.%m.%Y"}
}
Точность отображения влияет на плотность меток и читаемость диаграммы при большом количестве задач.
Группировка позволяет разделять задачи по проектам, фазам или исполнителям. В Vega-Lite это реализуется через дополнительную категориальную ось или цветовое кодирование.
{
"mark": "bar",
"encoding": {
"y": {"field": "task", "type": "nominal"},
"x": {"field": "start", "type": "temporal"},
"x2": {"field": "end"},
"color": {"field": "group", "type": "nominal"}
}
}
Цветовая шкала используется для визуального разделения блоков без изменения структуры данных.
Для повышения читаемости диаграммы применяется сортировка по дате начала:
"y": {
"field": "task",
"type": "nominal",
"sort": {"field": "start", "op": "min"}
}
Сортировка позволяет выстроить диаграмму в хронологическом порядке, снижая визуальный шум.
Диаграмма Ганта часто включает зависимости. В Vega-Lite прямой механизм связей отсутствует, поэтому применяется комбинированный подход:
Пример концептуального слоя:
{
"layer": [
{
"mark": "bar",
"encoding": {
"y": {"field": "task"},
"x": {"field": "start", "type": "temporal"},
"x2": {"field": "end"}
}
},
{
"mark": "rule",
"encoding": {
"x": {"field": "end", "type": "temporal"},
"x2": {"field": "start"},
"y": {"field": "task"}
}
}
]
}
Для сложных зависимостей применяется Vega (не Lite), где возможно вычисление координат через сигналы и пользовательские трансформации.
Слои позволяют разделять визуальные компоненты:
Пример добавления текущей даты:
{
"mark": "rule",
"encoding": {
"x": {"datum": "2026-01-20"},
"color": {"value": "red"}
}
}
Для построения сложных диаграмм используются трансформации:
filter — исключение задачcalculate — вычисление длительностиjoinaggregate — вычисление статистикwindow — ранжирование задачПример вычисления длительности:
"transform": [
{
"calculate": "datum.end - datum.start",
"as": "duration"
}
]
Контрольные точки отображаются как отдельные символы:
{
"mark": "point",
"encoding": {
"x": {"field": "start", "type": "temporal"},
"y": {"field": "task"},
"shape": {"value": "diamond"},
"size": {"value": 100}
}
}
Такие элементы не имеют длительности и служат индикаторами событий.
В Vega и Vega-Lite поддерживаются интерактивные элементы через:
Пример tooltip:
"encoding": {
"tooltip": [
{"field": "task"},
{"field": "start"},
{"field": "end"}
]
}
Выделение выбранной задачи:
"selection": {
"highlight": {
"type": "single",
"on": "mouseover"
}
}
Для больших проектов используется масштабирование:
"selection": {
"zoom": {
"type": "interval",
"encodings": ["x"]
}
}
Это позволяет изменять детализацию временной шкалы без изменения данных.
При отображении нескольких проектов используется вложенная группировка:
"row": {"field": "project", "type": "nominal"}
Каждый проект получает отдельную временную шкалу, что предотвращает наложение задач.
Цвет используется для кодирования:
"color": {
"field": "status",
"type": "nominal",
"scale": {
"domain": ["done", "in_progress", "blocked"],
"range": ["green", "orange", "red"]
}
}
При больших диапазонах дат применяется агрегация:
Это снижает плотность визуализации и улучшает читаемость.
Vega предоставляет полный контроль над сценой визуализации, включая:
Vega-Lite ориентирован на декларативное описание, где:
В контексте диаграмм Ганта Vega-Lite применяется для типовых сценариев, тогда как Vega используется для систем с зависимостями, критическими путями и динамическими изменениями структуры задач.
Эти ограничения компенсируются переходом к Vega или гибридным архитектурам, где Vega-Lite используется как слой спецификации данных, а Vega — как слой рендеринга и логики.