Chart.js поддерживает несколько способов описания точек данных, и
выбор структуры напрямую влияет на гибкость построения графиков,
читаемость кода и возможности масштабирования. Классический вариант с
массивами [x, y] постепенно уступает место объектной модели
{x, y}, особенно в сложных визуализациях, где требуется
явное связывание значений с осями и расширяемые наборы полей.
Chart.js допускает два основных формата точек:
Массив пар значений
data: [
[10, 20],
[15, 25],
[20, 30]
]
Объекты с именованными координатами
data: [
{ x: 10, y: 20 },
{ x: 15, y: 25 },
{ x: 20, y: 30 }
]
Первый вариант минималистичен и используется в простых сценариях. Второй вариант обеспечивает явную структуру данных и лучше подходит для расширяемых систем.
{x, y}Массив [x, y] требует знания порядка элементов. Ошибка в
позиции приводит к некорректной визуализации без явного указания
причины.
Объект {x, y} устраняет двусмысленность:
{ x: 150, y: 42 }
Каждое значение привязано к конкретному полю, что снижает вероятность логических ошибок при обработке данных.
Объектный формат позволяет расширять структуру без изменения логики графика:
{
x: 10,
y: 20,
label: "A",
group: "alpha",
color: "#ff0000"
}
Chart.js игнорирует лишние поля, но они могут использоваться в пользовательских плагинах, tooltip callbacks и внешней логике.
Объектный формат особенно важен при использовании:
Пример с временной осью:
data: [
{ x: "2025-01-01", y: 10 },
{ x: "2025-01-02", y: 15 },
{ x: "2025-01-03", y: 12 }
]
Chart.js автоматически интерпретирует x как значение
шкалы, если соответствующая ось настроена как временная или
категориальная.
Scatter — наиболее естественный тип для {x, y}:
const config = {
type: 'scatter',
data: {
datasets: [{
label: 'Точки',
data: [
{ x: 5, y: 10 },
{ x: 10, y: 20 },
{ x: 15, y: 25 }
]
}]
}
};
Каждая точка воспринимается независимо, порядок не критичен.
Line также поддерживает объектные точки:
const config = {
type: 'line',
data: {
datasets: [{
label: 'Линия',
data: [
{ x: 1, y: 3 },
{ x: 2, y: 6 },
{ x: 3, y: 4 }
]
}]
}
};
Здесь важно, что x не обязан быть индексом массива — он
становится реальной координатой на оси.
В классическом режиме Chart.js допускает:
data: [10, 20, 30]
labels: ['A', 'B', 'C']
Это категориальная модель, где:
labels задают ось Xdata задаёт YПри переходе на {x, y}:
data: [
{ x: 'A', y: 10 },
{ x: 'B', y: 20 },
{ x: 'C', y: 30 }
]
labels становятся необязательными, поскольку каждая
точка уже содержит собственную координату.
Chart.js позволяет управлять тем, какие поля использовать как координаты.
По умолчанию ожидаются ключи x и y.
data: [
{ x: 10, y: 20 }
]
При нестандартной структуре:
data: [
{ time: 10, value: 20 },
{ time: 20, value: 40 }
]
необходимо указать соответствие:
const config = {
type: 'line',
data: {
datasets: [{
parsing: {
xAxisKey: 'time',
yAxisKey: 'value'
},
data: [
{ time: 10, value: 20 },
{ time: 20, value: 40 }
]
}]
}
};
Это позволяет интегрировать Chart.js с API, где структура данных уже определена внешней системой.
Для оптимизации производительности можно отключить парсинг:
const config = {
type: 'scatter',
data: {
datasets: [{
parsing: false,
data: [
{ x: 1, y: 2 },
{ x: 3, y: 4 }
]
}]
}
};
В этом режиме Chart.js не выполняет преобразование входных данных, что снижает накладные расходы при больших наборах точек.
Массивы [x, y]:
Объекты {x, y}:
При объёмах данных от десятков тысяч точек разница в
производительности становится заметной только при отсутствии оптимизаций
(parsing, decimation,
normalized data).
При работе с потоковыми или обновляемыми данными объектный формат упрощает добавление новых точек:
chart.data.datasets[0].data.push({ x: Date.now(), y: value });
chart.update();
В массивном формате пришлось бы строго соблюдать порядок и позиционную структуру, что усложняет поддержку.
Chart.js допускает смешивание форматов в рамках одного dataset, но поведение зависит от конфигурации осей и парсинга:
data: [
{ x: 1, y: 2 },
[2, 3],
{ x: 3, y: 4 }
]
Подобные конструкции приводят к неоднозначности и обычно рассматриваются как технический анти-паттерн, если не заданы строгие правила parsing.
Объектный формат становится критически важным при работе с API, где данные приходят в виде JSON:
[
{ "timestamp": 1710000000, "value": 42 },
{ "timestamp": 1710003600, "value": 45 }
]
Chart.js позволяет использовать такие данные без преобразования:
datasets: [{
parsing: {
xAxisKey: 'timestamp',
yAxisKey: 'value'
},
data: apiResponse
}]
Это исключает промежуточные преобразования и снижает количество кода на стороне клиента.
При использовании {x, y} порядок элементов не всегда
критичен. Chart.js может автоматически сортировать точки по оси X в
зависимости от типа графика и настроек шкалы.
Для массивов [x, y] порядок становится значимым, так как
он напрямую влияет на построение линии.
Переход на объектную модель влияет на проектирование всей системы:
Объектный формат становится естественным промежуточным слоем между API, бизнес-логикой и визуализацией Chart.js