Цвет в графиках выполняет сразу несколько функций:
Неправильно подобранная палитра делает диаграммы трудночитаемыми, особенно для пользователей с нарушениями цветового восприятия. Визуализация может выглядеть красивой, но быть практически бесполезной для части аудитории.
В контексте веб-разработки доступность графиков особенно важна, поскольку диаграммы часто используются:
Chart.js предоставляет достаточно гибкие инструменты для создания доступных цветовых схем, однако ответственность за выбор палитры полностью лежит на разработчике.
Наиболее распространённый тип дальтонизма. Пользователь плохо различает зелёные оттенки.
Проблемные комбинации:
Снижение восприятия красного цвета.
Плохо различаются:
Редкая форма, связанная с восприятием синего цвета.
Проблемными становятся:
Практически полное отсутствие цветового восприятия.
Графики воспринимаются как градации серого.
Плохой пример:
datasets: [{
label: 'Прибыль',
data: [120, 150, 170],
backgroundColor: 'green'
}, {
label: 'Убыток',
data: [80, 60, 40],
backgroundColor: 'red'
}]
Если пользователь не различает красный и зелёный, смысл теряется.
Лучше дополнять цвет:
Недостаточный контраст между элементами делает график нечитаемым.
Особенно это важно для:
Слишком большое число оттенков перегружает восприятие.
Рекомендуется:
Если график остаётся понятным без цвета — это хороший признак доступности.
options: {
plugins: {
legend: {
labels: {
color: '#111'
}
}
}
}
Тёмный текст на светлом фоне обычно обеспечивает лучший контраст.
options: {
scales: {
x: {
ticks: {
color: '#222'
},
grid: {
color: '#d0d0d0'
}
},
y: {
ticks: {
color: '#222'
},
grid: {
color: '#d0d0d0'
}
}
}
}
Слишком светлая сетка затрудняет чтение значений.
Плохой пример:
backgroundColor: '#ffffff',
borderColor: '#f5f5f5'
Линия почти незаметна.
Лучше:
backgroundColor: '#ffffff',
borderColor: '#1565c0'
Одна из популярных доступных палитр:
const colors = [
'#000000',
'#E69F00',
'#56B4E9',
'#009E73',
'#F0E442',
'#0072B2',
'#D55E00',
'#CC79A7'
];
Преимущества:
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['A', 'B', 'C', 'D'],
datasets: [{
label: 'Продажи',
data: [12, 19, 7, 15],
backgroundColor: [
'#56B4E9',
'#E69F00',
'#009E73',
'#D55E00'
]
}]
}
});
Классический пример:
backgroundColor: [
'red',
'green'
]
Для многих пользователей цвета выглядят почти одинаково.
Безопаснее использовать:
Пример:
backgroundColor: [
'#1565C0',
'#EF6C00'
]
Полупрозрачные элементы могут ухудшать контраст.
Плохой пример:
backgroundColor: 'rgba(21, 101, 192, 0.2)'
На светлом фоне область становится почти невидимой.
backgroundColor: 'rgba(21, 101, 192, 0.6)'
Либо использование плотной границы:
borderColor: '#1565C0',
borderWidth: 2
Тонкие линии плохо различимы.
Рекомендуется:
borderWidth: 3
Chart.js поддерживает пунктир.
datasets: [{
label: '2024',
data: [12, 15, 18],
borderColor: '#1565C0',
borderDash: []
}, {
label: '2025',
data: [10, 13, 16],
borderColor: '#EF6C00',
borderDash: [8, 4]
}]
Даже без различения цветов линии остаются отличимыми.
pointRadius: 5,
pointHoverRadius: 7
Крупные точки улучшают восприятие.
borderColor: '#000',
borderWidth: 1
Контуры помогают различать соседние элементы.
Плохой пример:
[
'#1976D2',
'#1E88E5',
'#2196F3'
]
Цвета слишком похожи.
Лучше:
[
'#003f5c',
'#7a5195',
'#ef5675'
]
Сегменты часто различаются только цветом.
Это делает круговые диаграммы одной из самых проблемных визуализаций с точки зрения доступности.
borderColor: '#fff',
borderWidth: 3
Сегменты становятся визуально отделёнными.
Лучше избегать:
Оптимально:
Текстуры помогают различать элементы без цвета.
Например:
Популярная библиотека:
<script src="https://cdn.jsdelivr.net/npm/patternomaly"></script>
const patterns = [
pattern.draw('dot', '#1565C0'),
pattern.draw('dash', '#EF6C00')
];
new Chart(ctx, {
type: 'bar',
data: {
labels: ['A', 'B'],
datasets: [{
data: [10, 20],
backgroundColor: patterns
}]
}
});
Паттерны значительно повышают доступность.
WCAG рекомендует:
Полезные сервисы:
Частая проблема:
color: '#666'
На тёмном фоне текст становится плохо читаемым.
options: {
plugins: {
legend: {
labels: {
color: '#eee'
}
}
},
scales: {
x: {
ticks: {
color: '#ddd'
},
grid: {
color: '#444'
}
},
y: {
ticks: {
color: '#ddd'
},
grid: {
color: '#444'
}
}
}
}
HSL удобнее для управления контрастом.
Пример:
function generateColors(count) {
const colors = [];
for (let i = 0; i < count; i++) {
const hue = (360 / count) * i;
colors.push(`hsl(${hue}, 70%, 45%)`);
}
return colors;
}
Слишком светлые цвета плохо видны.
Рекомендуемые значения:
Позволяет отображать значения прямо на графике.
plugins: {
datalabels: {
color: '#111',
font: {
weight: 'bold'
}
}
}
Текстовые подписи уменьшают зависимость от цвета.
Мелкая легенда ухудшает читаемость.
legend: {
labels: {
font: {
size: 14
}
}
}
labels: {
boxWidth: 20,
boxHeight: 20
}
Инструменты:
Полезный метод:
const ctx = document.getElementById('salesChart');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Янв', 'Фев', 'Мар', 'Апр'],
datasets: [
{
label: '2024',
data: [10, 20, 15, 30],
borderColor: '#1565C0',
backgroundColor: 'rgba(21, 101, 192, 0.3)',
borderWidth: 3,
pointRadius: 5
},
{
label: '2025',
data: [15, 18, 22, 28],
borderColor: '#EF6C00',
borderDash: [8, 4],
borderWidth: 3,
pointRadius: 5
}
]
},
options: {
responsive: true,
plugins: {
legend: {
labels: {
color: '#111',
font: {
size: 14
}
}
}
},
scales: {
x: {
ticks: {
color: '#222'
},
grid: {
color: '#d0d0d0'
}
},
y: {
ticks: {
color: '#222'
},
grid: {
color: '#d0d0d0'
}
}
}
}
});
В этом примере используются: