You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chart.js堆叠分组柱状图实现问题:实际效果与预期不符

解决Chart.js堆叠分组柱状图渲染不符的问题

问题核心问题

你当前的代码存在几个关键错误导致渲染效果不符合预期:

  1. 数据格式错误:Chart.js柱状图的data不支持嵌套数组,你目前每个数据集的data是二维数组,违背了配置规范
  2. 堆叠逻辑配置错误:要实现「分组内堆叠、分组间并列」的效果,需要通过stack属性关联同组数据集,并正确设置轴的堆叠属性
  3. 轴方向设置错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:54:53