Chart.js堆叠分组柱状图实现问题:实际效果与预期不符
解决Chart.js堆叠分组柱状图渲染不符的问题
问题核心问题
你当前的代码存在几个关键错误导致渲染效果不符合预期:
- 数据格式错误:Chart.js柱状图的
data不支持嵌套数组,你目前每个数据集的data是二维数组,违背了配置规范 - 堆叠逻辑配置错误:要实现「分组内堆叠、分组间并列」的效果,需要通过
stack属性关联同组数据集,并正确设置轴的堆叠属性 - 轴方向设置错误:
indexAxis: 'y'会将图表转为横向柱状图,和你预期的X轴为任务状态标签的需求冲突
修正后的完整代码
<!DOCTYPE html> <html> <head> <title>Task Status Bar Chart</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body> <canvas id="myChart" width="800" height="400"></canvas> <script> var ctx = document.getElementById('myChart').getContext('2d'); // 统一管理优先级对应的配色 const priorityColors = { Blocked: { bg: 'rgba(255, 99, 132, 0.5)', border: 'rgba(255, 99, 132, 1)' }, High: { bg: 'rgba(54, 162, 235, 0.5)', border: 'rgba(54, 162, 235, 1)' }, Critical: { bg: 'rgba(75, 192, 192, 0.5)', border: 'rgba(75, 192, 192, 1)' }, Low: { bg: 'rgba(255, 206, 86, 0.5)', border: 'rgba(255, 206, 86, 1)' }, Medium: { bg: 'rgba(153, 102, 255, 0.5)', border: 'rgba(153, 102, 255, 1)' } }; // 定义分组和X轴标签 const groups = ['Under Review', 'In Progress', 'New', 'Completed']; const statusLabels = ['ToDo', 'InProgress', 'Done']; // 构造数据集:每个优先级+分组的组合作为独立数据集,通过stack属性绑定堆叠组 const datasets = []; Object.keys(priorityColors).forEach(priority => { groups.forEach(group => { datasets.push({ label: `${group} - ${priority}`, data: getPriorityData(group, priority), backgroundColor: priorityColors[priority].bg, borderColor: priorityColors[priority].border, borderWidth: 1, stack: group // 同一分组的数据集共享stack值,实现组内堆叠 }); }); }); var myChart = new Chart(ctx, { type: 'bar', data: { labels: statusLabels, datasets: datasets }, options: { scales: { x: { stacked: false, // X轴方向分组并列展示 title: { display: true, text: '任务状态' } }, y: { stacked: true, // Y轴方向同一分组内堆叠 title: { display: true, text: '任务数量' } } }, plugins: { legend: { position: 'top', // 可按需过滤图例,避免条目过多 labels: { boxWidth: 15 } } } } }); // 匹配原数据的映射函数 function getPriorityData(group, priority) { const dataMap = { 'Under Review': { Blocked: [10,5,0], High: [20,10,5], Critical: [5,5,10], Low: [5,10,20], Medium: [10,15,15] }, 'In Progress': { Blocked: [10,5,0], High: [20,10,5], Critical: [5,5,10], Low: [5,10,20], Medium: [10,15,15] }, 'New': { Blocked: [10,5,0], High: [20,10,5], Critical: [5,5,10], Low: [5,10,20], Medium: [10,15,15] }, 'Completed': { Blocked: [10,5,0], High: [20,10,5], Critical: [5,5,10], Low: [5,10,20], Medium: [10,15,15] } }; return dataMap[group][priority]; } </script> </body> </html>
关键修改说明
- 数据结构重构:将每个「分组+优先级」的组合拆分为独立数据集,通过
stack属性指定哪些数据集属于同一堆叠组 - 堆叠逻辑修正:Y轴设置
stacked: true实现同一分组内的堆叠效果,X轴设置stacked: false实现分组间的并列展示 - 轴方向调整:移除
indexAxis: 'y',使用默认纵向柱状图,匹配X轴为任务状态的需求 - 代码可维护性优化:统一提取配色和数据映射,避免重复代码
内容的提问来源于stack exchange,提问作者Vivek Burman
相关产品推荐
相关产品推荐

