首页 文章

如何在highcharts柱形图的每个类别中引用另一个系列的yData

提问于
浏览
0

我有一个柱形图,它显示了两个系列,其中包含了多年的数据 .

每年的两个系列都有一列 .

我想为这些列创建一个数据标签,显示每年的两列值(yData的总和)的总和的百分比 . 为此,我需要引用当前y值和给定类别(年)中两个y值的总和 .

我尝试过这样的事情:

dataLabels:{
    enabled:true,
    formatter:function(e) {
        var mychart = $('#e_74').highcharts();
        var sum = parseInt(mychart .series[1].yData, 10) + parseInt(mychart .series[0].yData, 10);
        var pcnt = (this.y / sum * 100);
        return Highcharts.numberFormat(pcnt) + '%';                     
    }
}

The Problem:

这适用于第一年/类别,因为yData的总和始终是两个系列的第一个元素的总和 - 所以它在第一年是正确的 . 然而,随后几年仍然参考前两个元素的总和 - 使后续数据标签不准确 .

如何引用每个类别的yData的当前总和?

在此先感谢您的时间 .

这是我正在进行的工作的jsfiddle

这里是我试图为此图实现的完整代码的副本

$(function () {         
     $('#e_74').highcharts({
        chart: {
            type: 'column'
        },
        credits: {
        enabled: false
        },
        noData: {
            style: {
                fontWeight: 'bold',
                fontSize: '20px'
            }
        },
        title: {
            text: 'Title',
        },
        navigation: {
            buttonOptions:
            {
                enabled: false
            }
        },
        xAxis: {
              categories: [2013, 2014]
        },
        yAxis: {
            min: 0,
            title: {
                text: 'Number '
            }
        },
        tooltip: {
            headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
            pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
                '<td style="padding:0"><b>{point.y:,.0f} </b></td></tr>',
            footerFormat: '</table>',
            shared: true,
            useHTML: true
        },
        plotOptions: {
            column: {
                pointPadding: 0,
                borderWidth: 0
                },
            series: {
             dataLabels:{
                    enabled:true,
                    formatter:function(e) {
                        var mychart = $('#e_74').highcharts();    
                        var sum = parseInt(mychart.series[1].yData[1], 10) + parseInt(mychart.series[0].yData[1], 10);
                        var pcnt = (this.y /  sum * 100);
                        return Highcharts.numberFormat(pcnt) + '%';
                    }
                }
                }
            },
            series: [{showInLegend: true, name: 'With trained HW', data: [94426, 147615]}, {showInLegend: true, name: 'Without trained HW', data: [16863, 29198]}]
        });
    });

1 回答

  • 1

    您需要获取x索引才能引用正确的类别 .

    如果您使用循环执行此操作,则可以将其设置为动态,以便它适用于任意数量的系列:

    formatter:function() {
      var i = this.point.index;
      var sum = 0;
      $.each(this.series.chart.series, function() {
        sum += this.yData[i];
      })
      var pcnt = (this.y /  sum * 100);
      return Highcharts.numberFormat(pcnt) + '%';
    }
    

    例:

    附加系列示例:

    OTOH,这会冗余地计算总数,如果你有很多数据点,这可能是一个问题 .

    在构建图表之前计算相关值并将相应的百分比值与每个数据点一起作为可选变量发送,以便从数据标签中引用可能是值得的 .

    EDIT -------------------

    预处理数据并使用'totals'数组计算每个柱的百分比的示例,从而避免重复计算每个柱的相同总数:

相关问题