Click events on Pie Charts in Chart.js

后端 未结 10 2020
失恋的感觉
失恋的感觉 2020-11-28 03:29

I\'ve got a question regard Chart.js.

I\'ve drawn multiple piecharts using the documentation provided. I was wondering if on click of a certain slice of one of the

相关标签:
10条回答
  • 2020-11-28 03:38

    To successfully track click events and on what graph element the user clicked, I did the following in my .js file I set up the following variables:

    vm.chartOptions = {
        onClick: function(event, array) {
            let element = this.getElementAtEvent(event);
            if (element.length > 0) {
                var series= element[0]._model.datasetLabel;
                var label = element[0]._model.label;
                var value = this.data.datasets[element[0]._datasetIndex].data[element[0]._index];
            }
        }
    };
    vm.graphSeries = ["Series 1", "Serries 2"];
    vm.chartLabels = ["07:00", "08:00", "09:00", "10:00"];
    vm.chartData = [ [ 20, 30, 25, 15 ], [ 5, 10, 100, 20 ] ];
    

    Then in my .html file I setup the graph as follows:

    <canvas id="releaseByHourBar" 
        class="chart chart-bar"
        chart-data="vm.graphData"
        chart-labels="vm.graphLabels" 
        chart-series="vm.graphSeries"
        chart-options="vm.chartOptions">
    </canvas>
    
    0 讨论(0)
  • 2020-11-28 03:39

    I was facing the same issues since several days, Today i have found the solution. I have shown the complete file which is ready to execute.

    <html>
    <head><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js">
    </script>
    </head>
    <body>
    <canvas id="myChart" width="200" height="200"></canvas>
    <script>
    var ctx = document.getElementById("myChart").getContext('2d');
    var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        },
    onClick:function(e){
        var activePoints = myChart.getElementsAtEvent(e);
        var selectedIndex = activePoints[0]._index;
        alert(this.data.datasets[0].data[selectedIndex]);
    
    
    }
    }
    });
    </script>
    </body>
    </html>
    
    0 讨论(0)
  • 2020-11-28 03:43

    Using Chart.JS version 2.1.3, answers older than this one aren't valid anymore. Using getSegmentsAtEvent(event) method will output on console this message:

    getSegmentsAtEvent is not a function

    So i think it must be removed. I didn't read any changelog to be honest. To resolve that, just use getElementsAtEvent(event) method, as it can be found on the Docs.

    Below it can be found the script to obtain effectively clicked slice label and value. Note that also retrieving label and value is slightly different.

    var ctx = document.getElementById("chart-area").getContext("2d");
    var chart = new Chart(ctx, config);
    
    document.getElementById("chart-area").onclick = function(evt)
    {   
        var activePoints = chart.getElementsAtEvent(evt);
    
        if(activePoints.length > 0)
        {
          //get the internal index of slice in pie chart
          var clickedElementindex = activePoints[0]["_index"];
    
          //get specific label by index 
          var label = chart.data.labels[clickedElementindex];
    
          //get value by index      
          var value = chart.data.datasets[0].data[clickedElementindex];
    
          /* other stuff that requires slice's label and value */
       }
    }
    

    Hope it helps.

    0 讨论(0)
  • 2020-11-28 03:48

    Within options place your onclick and call the function you need as an example the ajax you need, I'll leave the example so that every click on a point tells you the value and you can use it in your new function.

        options: {
            plugins: {
                // Change options for ALL labels of THIS CHART
                datalabels: {
                    color: 'white',
                    //backgroundColor:'#ffce00',
                    align: 'start'
                }
            },
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true,
                        fontColor: "white"
                    },gridLines: {
                            color: 'rgba(255,255,255,0.1)',
                            display: true
                        }
                }],
                xAxes: [{
                    ticks: {
                        fontColor: "white"
                    },gridLines: {                        
                            display: false
                        }
                }]
            },
            legend: {
            display: false
    
        },
        //onClick: abre     
            onClick:function(e){ 
        var activePoints = myChart.getElementsAtEvent(e); 
        var selectedIndex = activePoints[0]._index; 
        alert(this.data.datasets[0].data[selectedIndex]); 
    
    
    } 
        }
    
    0 讨论(0)
  • 2020-11-28 03:51

    If you are using TypeScript, the code is a little funky because there is no type inference, but this works to get the index of the data that has been supplied to the chart: // events public chartClicked(e:any):void { //console.log(e);

        try {
            console.log('DS ' + e.active['0']._datasetIndex);
            console.log('ID ' +  e.active['0']._index);
            console.log('Label: ' + this.doughnutChartLabels[e.active['0']._index]);
            console.log('Value: ' + this.doughnutChartData[e.active['0']._index]);
    
    
        } catch (error) {
            console.log("Error In LoadTopGraph", error);
        }
    
        try {
            console.log(e[0].active);
        } catch (error) {
            //console.log("Error In LoadTopGraph", error);
        }
    
    
    
    }
    
    0 讨论(0)
  • 2020-11-28 03:53

    Chart.js 2.0 has made this even easier.

    You can find it under common chart configuration in the documentation. Should work on more then pie graphs.

    options:{
        onClick: graphClickEvent
    }
    
    function graphClickEvent(event, array){
        if(array[0]){
            foo.bar; 
        }
    }
    

    It triggers on the entire chart, but if you click on a pie the model of that pie including index which can be used to get the value.

    0 讨论(0)
提交回复
热议问题