由于我的堆栈栏有多个部分,所以从单个堆栈栏的每个部分获取单击的对象Chart.js [英] Getting clicked object from each section of a single stack bar as my stack bar has multiple sections Chart.js

查看:37
本文介绍了由于我的堆栈栏有多个部分,所以从单个堆栈栏的每个部分获取单击的对象Chart.js的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开发了一个带有三个部分或数据源的单个堆积杆.我想知道我点击了哪个部分.

I have developed a single Stacked bar with three section or data source. I want to know which section I have clicked.

这是我的代码 .ts 文件

this.chart = new Chart("Chart1", {
    type: 'bar',
    data: {
        datasets: [{
            label: 'Data1',
            data: [27],             
        },
        {
            label: 'Data2',
            data: [40],
        },
        {
            label: 'Data3',                
            data: [12],
        }

    ],
    }     
});

showData(evt:any){
  var data = this.chart.getElementsAtEvent(evt)
  console.log(data[0]._model); // it prints the value of the property
}

data 中,我没有得到数据 object ,而是得到了 chart 的配置,但我只想获取单击的记录.

In the data I am not getting data object rather I getting chart configuration but I just want to get the record which I clicked.

html 文件

<div id="mydiv">
  <canvas id="Chart1" (click)="showData($event)"></canvas>
</div>

这是我的酒吧

推荐答案

您可以按以下方式定义 showData 函数,如果您的数据集包含多个值,则也可以这样:

You can define the showData function as follow, this will also if your datasets contain more than one value:

function showData(evt) {
  const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
  const index = chart.getElementAtEvent(event)[0]._index;
  const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
  console.log(model.datasetLabel, chart.config.data.datasets[datasetIndex].data[index]);
}

我不是直接在 canvas 上添加(click)事件处理程序,而是在图表选项中定义 onClick 函数如下:

Instead of adding the (click) event handler directly on the canvas, I would also rather define the onClick function within the chart options as follows:

options: {
  onClick: showData,

请查看可运行的代码段.

Please have a look at the runnable code snippet.

function showData(evt) {
  const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
  const index = chart.getElementAtEvent(event)[0]._index;
  const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
  console.log(model.datasetLabel, chart.config.data.datasets[datasetIndex].data[index]);
}

const chart = new Chart("Chart1", {
  type: 'bar',
  data: {
    labels: ['A', 'B'],
    datasets: [{
        label: 'Data1',
        data: [27, 22],
        backgroundColor: 'red'
      },
      {
        label: 'Data2',
        data: [40, 15],
        backgroundColor: 'orange'
      },
      {
        label: 'Data3',
        data: [12, 31],
        backgroundColor: 'blue'
      }
    ]
  },
  options: {
    onClick: showData,
    legend: {
      display: false
    },
    tooltips: {
      enabled: false
    },
    responsive: true,
    scales: {
      xAxes: [{
        stacked: true,
      }],
      yAxes: [{
        stacked: true,
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
});

canvas {
  max-width: 200px;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="Chart1" height="200"></canvas>

这篇关于由于我的堆栈栏有多个部分,所以从单个堆栈栏的每个部分获取单击的对象Chart.js的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆