提问者:小点点

如何隐藏特定图表的图例显示?


我现在尝试的是,如果我有一个图表,然后,当我点击一个按钮与“onchange”功能,它将显示几个图表。但当我点击后退,我有我想要的图表,但仍然有“图例”的第二个图表在第一个图表的顶部。

有没有办法去除它?我找到了选项:{legend:{display:false},但它删除了所有图表的图例。

这是我的代码

null

<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
        integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ=="
        crossorigin="anonymous"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
    <script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>

</head>
<body>
    <div class="row mt-3">
        <div class="col-md-12">
            <div style="width:75%; margin: 0 auto;">
                <canvas id="myChart"></canvas>
            </div>
            <div class="form-check form-switch">
                <input class="form-check-input" type="checkbox" id="checkBox" onchange="toggleCategories(event)">
                <label class="form-check-label" for="checkBox">Catégories</label>
            </div>
        </div>
    </div>


     <script>
        var test1 = [0, 10, 5, 2, 20, 30, 45, 60, 43, 22, 11, 23];
        var test2 = [90, 80, 75, 62, 50, 40, 35, 11, 2, 24, 28, 34];
        var test3 = [90, 10, 90, 10, 50, 40, 23, 62, 13, 32, 11, 13];

        var ctx = document.getElementById('myChart').getContext('2d');
            var chart = new Chart(ctx, {
                // The type of chart we want to create
                type: 'line',

                // The data for our dataset
                data: {
                    labels: ['January', 'February', 'test3', 'test4', 'test5', 'test6', 'test7', 'test9', 'test10', 'test11', 'test12'],
                    datasets: [{
                        label: 'My test1',
                        fill : false,
                        borderColor: 'rgb(255, 99, 132)',
                        data: test1,
                    }, {fill : false
                    }]
                },

                // Configuration options go here
                options: {}
            });

            function toggleCategories(e){
                if (e.target.checked) {
                  chart.data.datasets[0].label = 'My test2';
                  chart.data.datasets[0].data = test2;
                  chart.data.datasets[0].borderColor = 'rgb(255, 99, 132)';
                  chart.data.datasets[1].label = 'My test3';
                  chart.data.datasets[1].data = test3;
                  chart.data.datasets[1].borderColor = 'rgb(255, 99, 132)';
                } else {
                    chart.data.datasets[0].label = 'My test1';
                  chart.data.datasets[0].data = test1;
                  chart.data.datasets[0].borderColor = 'rgb(255, 99, 132)';
                  chart.data.datasets[1].label = '';  
                  chart.data.datasets[1].data = '';
                  chart.data.datasets[1].borderColor = '';
                }
                chart.update();
            }
    </script>

</body>
</html>

null

亲切地


共2个答案

匿名用户

你试过切换浏览器吗?我已经在chrome上测试了你的代码,它似乎工作得很好。在图例的开始,第二个图形是未定义的,当我回去,它不再是,但它是灰色的。在我看来很好..让我知道。你好,我希望我已经帮到你了…

匿名用户

Chart.js高度依赖于它的数据。因此,最简单的方法就是在需要时动态地将必要的数据填充到图表中。这将按照预期添加和删除图例。但是,不要忘记在数据更改时更新您的图表。

让我们添加一些代码来了解一下它,因为基本上你确实在做--只是有点错误。

图表的数据存储在数据集中。正如我们所看到的,您有两个条目,而第二个只是一个包含布尔属性(fill)的对象。因此,它在一开始就在您的传奇中显示undefined

datasets: [{
  label: 'My test1',
  fill: false,
  borderColor: 'rgb(255, 99, 132)',
  data: test1,
}, {
  fill: false
}]

但是,当切换复选框时,它看起来很好,因为您覆盖了togglecategories中的所有内容,如下所示。

function toggleCategories(e) {
  if (e.target.checked) {
    chart.data.datasets[0].label = 'My test2';
    chart.data.datasets[0].data = test2;
    chart.data.datasets[0].borderColor = 'rgb(255, 99, 132)';
    chart.data.datasets[1].label = 'My test3';
    chart.data.datasets[1].data = test3;
    chart.data.datasets[1].borderColor = 'rgb(255, 99, 132)';
  } else {
    ...
  }
  chart.update();
}

但是仔细看一下else就会发现这里发生了什么。

    // Those 3 lines just reset on index 1, it doesn't get deleted
    chart.data.datasets[1].label = '';
    chart.data.datasets[1].data = '';
    chart.data.datasets[1].borderColor = '';

因此,当您只想要1时,为了摆脱第2个图例,您只需删除DataSet[1]的对象,并在需要时重新添加它。

您可能需要查看这个小提琴,以获得一个完全工作的示例: