ChartJS: datalabels: show percentage value in Pie piece

后端 未结 4 1339
一向
一向 2020-12-09 02:33

I have a piechart with four labels:

var data = [{
    data: [50, 55, 60, 33],
    labels: [\"India\", \"China\", \"US\", \"Canada\"],
    backgroundColor: [
         


        
相关标签:
4条回答
  • 2020-12-09 03:16

    Updated fiddle with 2 decimal precision.

    You were not computing the sum, instead storing the current value in sum only for every value.

    Here is the working fiddle : https://jsfiddle.net/a1Lvn4eb/55/

    var data = [{
        data: [50, 55, 60, 33],
        labels: ["India", "China", "US", "Canada"],
        backgroundColor: [
            "#4b77a9",
            "#5f255f",
            "#d21243",
            "#B27200"
        ],
        borderColor: "#fff"
    }];
    
    var options = {
        tooltips: {
            enabled: false
        },
        plugins: {
            datalabels: {
                formatter: (value, ctx) => {
                    let sum = 0;
                    let dataArr = ctx.chart.data.datasets[0].data;
                    dataArr.map(data => {
                        sum += data;
                    });
                    let percentage = (value*100 / sum).toFixed(2)+"%";
                    return percentage;
                },
                color: '#fff',
            }
        }
    };
    
    var ctx = document.getElementById("pie-chart").getContext('2d');
    var myChart = new Chart(ctx, {
        type: 'pie',
        data: {
            datasets: data
        },
        options: options
    });
    
    0 讨论(0)
  • 2020-12-09 03:25

    You could use the tooltip with an Array reducer to perform the percentage calculation and display it.

      tooltips: {
        callbacks: {
          label: function (tooltipItem, data) {
            try {
              let label = ' ' + data.labels[tooltipItem.index] || '';
    
              if (label) {
                label += ': ';
              }
    
              const sum = data.datasets[0].data.reduce((accumulator, curValue) => {
                return accumulator + curValue;
              });
              const value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
    
              label += Number((value / sum) * 100).toFixed(2) + '%';
              return label;
            } catch (error) {
              console.log(error);
            }
          }
        }
      }
    
    0 讨论(0)
  • 2020-12-09 03:28

    The problem is how you're calculating sum. See below.

    Fiddle

     var data = [{
       data: [50, 55, 60, 33],
       labels: ["India", "China", "US", "Canada"],
       backgroundColor: [
         "#4b77a9",
         "#5f255f",
         "#d21243",
         "#B27200"
       ],
       borderColor: "#fff"
     }];
    
     var options = {
       tooltips: {
         enabled: false
       },
       plugins: {
         datalabels: {
           formatter: (value, ctx) => {
    
             let datasets = ctx.chart.data.datasets;
    
             if (datasets.indexOf(ctx.dataset) === datasets.length - 1) {
               let sum = datasets[0].data.reduce((a, b) => a + b, 0);
               let percentage = Math.round((value / sum) * 100) + '%';
               return percentage;
             } else {
               return percentage;
             }
           },
           color: '#fff',
         }
       }
     };
    
    
     var ctx = document.getElementById("pie-chart").getContext('2d');
     var myChart = new Chart(ctx, {
       type: 'pie',
       data: {
         datasets: data
       },
       options: options
     });
    
    0 讨论(0)
  • 2020-12-09 03:32

    I like to add a little in accepted answer, ctx.chart.data.datasets[0].data always gives you entire data even if you filter out some data by clicking on legend, means you will always get same percentage for a country even if you filter out some countries.

    I have used context.dataset._meta[0].total to get the filtered total.

    Here is the working snippet:

    var data = [{
      data: [50, 55, 60, 33],
      backgroundColor: [
        "#4b77a9",
        "#5f255f",
        "#d21243",
        "#B27200"
      ],
      borderColor: "#fff"
    }];
    
    var options = {
      tooltips: {
        enabled: true
      },
      plugins: {
        datalabels: {
          formatter: (value, ctx) => {
    
            let sum = ctx.dataset._meta[0].total;
            let percentage = (value * 100 / sum).toFixed(2) + "%";
            return percentage;
    
    
          },
          color: '#fff',
        }
      }
    };
    
    
    var ctx = document.getElementById("pie-chart").getContext('2d');
    var myChart = new Chart(ctx, {
      type: 'pie',
      data: {
      labels: ['India', 'China', 'US', 'Canada'],
        datasets: data
      },
      options: options
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.7.0"></script>
    <canvas id="pie-chart"></canvas>

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