В Chart.js каждый набор данных (dataset) может быть независимо скрыт
или отображён без пересоздания графика. Управление видимостью опирается
на внутреннее состояние метаданных диаграммы и свойство конфигурации
hidden, которое поддерживается как на уровне инициализации,
так и в процессе работы графика.
Каждый dataset может содержать поле hidden, определяющее
начальную видимость:
const config = {
type: 'line',
data: {
labels: ['Янв', 'Фев', 'Мар'],
datasets: [
{
label: 'Продажи',
data: [10, 20, 15],
hidden: false
},
{
label: 'Расходы',
data: [5, 12, 8],
hidden: true
}
]
}
};
При инициализации графика dataset с hidden: true не
отображается, но остаётся частью структуры данных и может быть
активирован в любой момент.
После создания графика Chart.js хранит состояние каждого dataset в
метаданных, доступных через
chart.getDatasetMeta(index):
const meta = chart.getDatasetMeta(0);
meta.hidden = true;
chart.update();
Здесь meta.hidden управляет фактической отрисовкой.
Изменение состояния требует вызова chart.update(), иначе
изменения не будут применены визуально.
Наиболее распространённый подход — инвертирование текущего состояния:
function toggleDataset(chart, datasetIndex) {
const meta = chart.getDatasetMeta(datasetIndex);
meta.hidden = !meta.hidden;
chart.update();
}
Такой механизм используется для кастомных элементов управления, не связанных со стандартной легендой.
Chart.js поддерживает несколько способов определения скрытого состояния:
dataset.hidden — начальная конфигурацияmeta.hidden — динамическое состояниеdataset.showLine (для line charts) — частичное
управление отрисовкой элементовПриоритет отдаётся метаданным, так как они отражают текущее состояние интерфейса.
Легенда Chart.js по умолчанию уже реализует переключение видимости
datasets через обработчик onClick.
const config = {
type: 'bar',
data: {
labels: ['A', 'B', 'C'],
datasets: [
{ label: 'Dataset 1', data: [1, 2, 3] },
{ label: 'Dataset 2', data: [3, 2, 1] }
]
},
options: {
plugins: {
legend: {
onClick: function (e, legendItem, legend) {
const index = legendItem.datasetIndex;
const chart = legend.chart;
const meta = chart.getDatasetMeta(index);
meta.hidden = meta.hidden === null ? !chart.data.datasets[index].hidden : !meta.hidden;
chart.update();
}
}
}
}
};
Поведение по умолчанию уже включает переключение, но кастомизация позволяет внедрять дополнительные условия: блокировку, синхронизацию нескольких графиков или каскадное скрытие.
При работе с несколькими наборами данных часто требуется синхронное управление:
function showOnly(chart, visibleIndex) {
chart.data.datasets.forEach((_, index) => {
const meta = chart.getDatasetMeta(index);
meta.hidden = index !== visibleIndex;
});
chart.update();
}
Этот подход используется для режимов «фокусировки», где отображается только один набор данных.
В более новых версиях Chart.js доступен метод:
chart.setDatasetVisibility(0, false);
chart.update();
Он изменяет видимость более декларативно, скрывая прямую работу с метаданными.
Аналогичное отображение:
chart.setDatasetVisibility(1, true);
chart.update();
Метод учитывает внутренние правила библиотеки и предпочтительнее
прямого изменения meta.hidden.
Для анализа состояния всех datasets используется
isDatasetVisible:
const visible = chart.isDatasetVisible(0);
Возвращаемое значение отражает итоговую видимость, включая все внутренние флаги.
При создании кастомных контролов (например, кнопок переключения) состояние обычно связывается с datasetIndex:
button.addEventListener('click', () => {
const visible = chart.isDatasetVisible(2);
chart.setDatasetVisibility(2, !visible);
chart.update();
});
Это позволяет полностью отделить визуальные элементы управления от самой библиотеки графиков.
При изменении видимости Chart.js не просто скрывает dataset, а перерасчитывает анимационные значения. Это особенно заметно в линейных и столбчатых графиках.
update('none')Для мгновенного переключения используется режим обновления:
chart.setDatasetVisibility(0, false);
chart.update('none');
Такой вызов пропускает анимационный слой и сразу пересчитывает визуальное состояние.
При необходимости полного скрытия данных:
chart.data.datasets.forEach((_, index) => {
chart.setDatasetVisibility(index, false);
});
chart.update();
Этот метод применяется при переключении режимов отображения или фильтрации данных на уровне интерфейса.
Скрытые datasets могут влиять на масштаб осей в зависимости от конфигурации:
beginAtZero: true скрытие может не менять
шкалуЭто поведение важно учитывать при динамическом переключении, чтобы избежать «скачков» масштаба.
При использовании нескольких экземпляров Chart.js возможно синхронизированное управление:
function syncVisibility(charts, datasetIndex, state) {
charts.forEach(chart => {
chart.setDatasetVisibility(datasetIndex, state);
chart.update();
});
}
Такой подход применяется в дашбордах и аналитических панелях, где наборы данных повторяются в нескольких визуализациях.
Для отладки используются комбинации API:
chart.data.datasets.forEach((_, i) => {
console.log(i, chart.isDatasetVisible(i));
});
Это позволяет отслеживать несоответствия между конфигурацией и реальным состоянием отображения, особенно при сложных пользовательских взаимодействиях.