Highcharts percentage of total for simple bar chart

前端 未结 4 862
野的像风
野的像风 2020-11-30 07:12

I have a simple 1-series bar chart where each bar has a nominal value. I can plot this fine with the data labels and axis representing the value for each bar but I\'d like t

相关标签:
4条回答
  • 2020-11-30 07:30

    @jlbriggs had a great answer and lead me onto the path of creating this formatter function. This function always checks the current values in the data. If the data is updated programmatically at a later time, the percentages will reflect the newly updated data. No dataSum or loop is necessary as the .map().reduce() takes care of that for you.

    dataLabels: {
      enabled: true,
      formatter: function() {
        var pcnt = (this.y / this.series.data.map(p => p.y).reduce((a, b) => a + b, 0)) * 100;
        return Highcharts.numberFormat(pcnt) + '%';
      }
    }
    
    0 讨论(0)
  • 2020-11-30 07:41

    You'll have to loop through the data and get the total, and then use the datalabel formatter function to get the percent.

    Example here:

    http://jsfiddle.net/JVNjs/319/

    formatter:function() {
      var pcnt = (this.y / dataSum) * 100;
      return Highcharts.numberFormat(pcnt) + '%';
    }
    

    edit::

    updated example with axis labels:

    http://jsfiddle.net/JVNjs/320/

    [[EDIT for comments

    If you are trying to plot the percent values of multiple series, there are a variety of fundamental problems that arise.

    If you are calculating the % of two different data series, and displaying the % value even though you've plotted the raw value, your chart will be misleading and confusing in most cases.

    Plotting the data as the percent values directly is the best way to go in that case, and you can add the raw data value as an extra property in the point object if you want to display it in a tool tip or elsewhere ( ie http://jsfiddle.net/JVNjs/735/ )

    If you insist on using the original method on two different series, then you can just create two different variables to calculate against, and check the series name in the formatter to determine which data sum to calculate against.

    0 讨论(0)
  • 2020-11-30 07:45

    Highchart library is very enrich with build in functions. if you would like to just for the number on chart up to certain number. you can give a try for below function.

    import {numberFormat} from 'hicghart';
    
    then you can achieve the below way formating
    
    numberFormat(this.y,decimalPlaceToFormat)
    
    0 讨论(0)
  • 2020-11-30 07:52

    try this.percentage

    It's pretty well documented in the highcharts API as well.

    http://api.highcharts.com/highcharts#plotOptions.series.dataLabels.formatter

    EDIT

    Since you'd need it for non-stacked series, you'd need to get the total before generating the graph... The function below adds up your values into one variable which you can use in your formatter function later.

    function arrayTotal(arr)
    {
      var total = 0;
      for (var i = 0, value; value = arr[i]; i++)
      {
        total += value;
      }
      return total;
    }
    
    0 讨论(0)
提交回复
热议问题