Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pie Chart Legend - Chart.js

I need help to put the number of the pie chart in the legend

Chart Image

If i hover the chart with mouse i can see the number relative to each item

i want to display it in the legend either

the important code so far:

var tempData = {     labels: Status,     datasets: [         {             label: "Status",             data: Qtd,             backgroundColor: randColor         },      ] };  var ctx = $("#pieStatus").get(0).getContext("2d"); var chartInstance = new Chart(ctx, {     type: 'pie',     data: tempData,     options: {          title: {             display: true,             fontsize: 14,             text: 'Total de Pedidos por Situação'         },         legend: {             display: true,             position: 'bottom',          },         responsive: false     }  }); 

"Qtd","randColor" are "var" already with values

like image 332
dpanegassi Avatar asked Sep 12 '16 16:09

dpanegassi


2 Answers

You need to edit the generateLabels property in your options :

options: {     legend: {         labels: {             generateLabels: function(chart) {                  // Here             }         }     } } 


Since it is quite a mess to create on your own a great template. I suggest using the same function as in the source code and then edit what is needed.

Here are a small jsFiddle, where you can see how it works (edited lines - from 38 - are commented), and its result :

enter image description here

like image 144
tektiv Avatar answered Sep 23 '22 14:09

tektiv


Maybe this is a hacky solution, but for me seems simpler.

The filter parameter

ChartJS legend options have a filter parameter. This is a function that is called for each legend item, and that returns true/false whether you want to show this item in the legend or not.

filter has 2 arguments:

  • legendItem : The legend item to show/omit. Its properties are described here
  • data : The data object passed to the chart.

The hack

Since JS passes objects by reference, and filter is called for each legend item, then you can mutate the legendItem object to show the text that you want.

legend : {   labels: {     filter: (legendItem, data) => {       // First, retrieve the data corresponding to that label       const label = legendItem.text       const labelIndex = _.findIndex(data.labels, (labelName) => labelName === label) // I'm using lodash here       const qtd = data.datasets[0].data[labelIndex]              // Second, mutate the legendItem to include the new text       legendItem.text = `${legendItem.text} : ${qtd}`              // Third, the filter method expects a bool, so return true to show the modified legendItem in the legend       return true     }   } }  
like image 24
Jose Carlos Coutinho Avatar answered Sep 25 '22 14:09

Jose Carlos Coutinho