You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Chart.js双数据集柱状图无法显示图例问题求助

解决Chart.js双轴柱状图图例不显示的问题

嘿,我帮你排查了几个导致图例无法正常显示的关键问题,咱们一步步来解决:

1. 核心问题:数据长度不匹配

你的labels数组有8个元素,但两个数据集dataFirstdataSeconddata数组只有7个元素。这种数量不匹配会让Chart.js渲染时出现异常,甚至直接影响图例的加载显示——这是最主要的原因。

2. 次要问题:Legend配置冗余

在Chart.js v2版本中,控制图例显示的核心配置是options.legend.display,你同时设置了enabled: truedisplay: true,虽然这俩属性效果类似,但冗余配置可能引发意外冲突,建议只保留display: true就够了。

修正后的完整代码

<html>
<body>
<canvas id="chart_plot" width="400" height="400"></canvas>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
<script>
function addData(chartID, labels, data) {
    // 全局基础配置
    Chart.defaults.scale.ticks.beginAtZero = true;
    Chart.defaults.global.responsive = true;
    Chart.defaults.global.maintainAspectRatio = true;

    var ctx = document.getElementById(chartID).getContext('2d');
    
    var newChartData = {
        type: "bar",
        data: {
            labels: labels, // 直接用传入的labels,避免重复处理
            datasets: data.datasets
        },
        options: {
            legend: {
                display: true, // 仅保留这个控制图例显示
                labels: {
                    fontColor: 'black',
                    fontSize: 18
                }
            },
            // 如果你需要真正的双轴(左右两个Y轴),可以添加下面的scales配置
            scales: {
                yAxes: [
                    {
                        position: 'left',
                        ticks: { beginAtZero: true }
                    }
                ]
            }
        }
    };

    console.log(JSON.stringify(newChartData, null, 2));
    var chart_plot = new Chart(ctx, newChartData);
    chart_plot.update();
}

// 修正数据长度,让每个数据集的data和labels数量一致
var dataFirst = {
    label: "% Change in Spends",
    data: [20, 15, 60, 60, 65, 30, 70, 0], // 补全第8个元素
    backgroundColor: Array(8).fill('rgba(219, 0, 17, 0.8)') // 简化重复的背景色设置
};
var dataSecond = {
    label: "% Change in Applications",
    data: [0, 59, 75, 20, 20, 55, 40, 0], // 补全第8个元素
    backgroundColor: Array(8).fill('rgba(117, 117, 117, 0.8)') // 简化重复的背景色设置
};
var speedData = { datasets: [dataFirst, dataSecond] };

// 调用函数生成图表
addData('chart_plot', ['TV', 'Press', 'Airport OOH', 'Search', 'Facebook', 'Twitter', 'Display', 'Affiliates'], speedData);
</script>
</body>
</html>

额外补充:实现真正的双轴柱状图

如果你需要的是左右两个独立Y轴的柱状图,还需要给每个数据集指定对应的Y轴,修改scales配置如下:

scales: {
    yAxes: [
        {
            id: 'y-axis-spends',
            position: 'left',
            ticks: {
                beginAtZero: true,
                fontColor: 'rgba(219, 0, 17, 0.8)'
            }
        },
        {
            id: 'y-axis-apps',
            position: 'right',
            ticks: {
                beginAtZero: true,
                fontColor: 'rgba(117, 117, 117, 0.8)'
            },
            gridLines: { display: false } // 隐藏右侧Y轴的网格线,避免重叠
        }
    ]
}

然后给两个数据集分别加上yAxisID

var dataFirst = {
    // ...其他配置
    yAxisID: 'y-axis-spends'
};
var dataSecond = {
    // ...其他配置
    yAxisID: 'y-axis-apps'
};

内容的提问来源于stack exchange,提问作者RajdeepB

火山引擎 最新活动