【问题标题】:ChartJS add custom tooltip to a stacked bar chartChartJS 将自定义工具提示添加到堆叠条形图
【发布时间】:2020-04-30 10:43:45
【问题描述】:

我有以下不同月份的数据

var barChartData = {
    labels: ["January", "February", "March", "April", "May", "June", "July"],
    datasets: [{
        label: 'Task 1',
        backgroundColor: "rgba(220,220,220,0.5)",
        data: [50, 40, 23, 45, 67, 78, 23]
    }, {
        label: 'Task 2',
        backgroundColor: "rgba(151,187,205,0.5)",
        data: [50, 40, 78, 23, 23, 45, 67]
    }, {
        label: 'Task 3',
        backgroundColor: "rgba(82,154,190,0.5)",
        data: [50, 67, 78, 23, 40, 23, 0]
    }]
};  

我想生成这样的工具提示

Expected chart

我试过下面的代码

var ctx = document.getElementById("canvas").getContext("2d");
var myBar = new Chart(ctx, {
    type: 'bar',
    data: barChartData,
    options: {
        title: {
            display: true,
            text: "Chart.js Bar Chart - Stacked"
        },
        tooltips: {
            mode: 'label',
            callbacks: {
                label: function(tooltipItem, data) {
                  
                   var tasks = data.datasets[tooltipItem.datasetIndex].label;
                   var valor = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
                   var count =  data.datasets.length;
                   var total = 0;
                   var label = '';
                   
                   for (var i = 0; i < data.datasets.length; i++) {
                       total += data.datasets[i].data[tooltipItem.index];                       
                   }                   
                   label += "Total : " + total + "(";
                   
                    for (var i = 0; i < data.datasets.length; i++) {
                       label += data.datasets[tooltipItem.datasetIndex].label + " - $" + tooltipItem.yLabel.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ",";
                    }
                    var lastChar = label.slice(-1);
                    if (lastChar === ',') {
                        label = label.slice(0, -1);
                    }
                    
                    label += ")";
                   return [ label, "Count : " + count ];
                }
            }
        },
        responsive: true,
        scales: {
            xAxes: [{
                stacked: true,
            }],
            yAxes: [{
                stacked: true
            }]
        }
    }
});

我需要每月显示一个工具提示,因此我将模式切换为“标签”,它会创建三个单独的工具提示。我怎样才能达到预期的输出?

谢谢

【问题讨论】:

    标签: javascript chart.js


    【解决方案1】:

    你快到了... 诀窍是回调函数必须收集并返回标签的array 一次,而不是每个dataset

    callbacks: {
      label: (tooltipItem, data) => {
        if (tooltipItem.datasetIndex > 0) {
          return null;
        }
    

    在编写主标签时也存在访问错误对象/属性的问题。

    请在下面查看您修改后的代码。

    new Chart("canvas", {
      type: 'bar',
      data: {
        labels: ["January", "February", "March", "April", "May", "June", "July"],
        datasets: [{
          label: 'Task 1',
          backgroundColor: "rgba(220,220,220,0.5)",
          data: [50, 40, 23, 45, 67, 78, 23]
        }, {
          label: 'Task 2',
          backgroundColor: "rgba(151,187,205,0.5)",
          data: [50, 40, 78, 23, 23, 45, 67]
        }, {
          label: 'Task 3',
          backgroundColor: "rgba(82,154,190,0.5)",
          data: [50, 67, 78, 23, 40, 23, 0]
        }]
      },
      options: {
        title: {
          display: true,
          text: "Chart.js Bar Chart - Stacked"
        },
        tooltips: {
          mode: 'label',
          callbacks: {
            label: (tooltipItem, data) => {
              if (tooltipItem.datasetIndex > 0) {
                return null;
              }
              var tasks = data.datasets[tooltipItem.datasetIndex].label;
              var valor = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
              var count = data.datasets.length;
              var total = 0;
              var label = '';
              for (var i = 0; i < data.datasets.length; i++) {
                total += data.datasets[i].data[tooltipItem.index];
              }
              label += "Total : " + total + " (";
              for (var i = 0; i < data.datasets.length; i++) {
                if (label.endsWith(",")) {
                  label += " ";
                }
                label += data.datasets[i].label + " - $" + data.datasets[i].data[tooltipItem.index].toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ",";
              }
              label = label.slice(0, -1) + ")";
              return [label, "Count : " + count];
            }
          }
        },
        responsive: true,
        scales: {
          xAxes: [{
            stacked: true,
          }],
          yAxes: [{
            stacked: true
          }]
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>
    <canvas id="canvas" height="100"></canvas>

    【讨论】:

    • 我注意到工具提示总是选择任务 1 的配色方案,有什么办法可以去掉 Total 前面的颜色方块并计数?
    • @Nim:你可以通过labelColor回调函数改变盒子的颜色,但我不知道你是否可以移除它(见chartjs.org/docs/latest/configuration/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多