我有一个柱形图,它显示两个系列,包含数年的数据。
每年都有两个系列的每一列。
我想为这些列创建一个数据标签,显示每年的两列值(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) + '%';
}
}
问题:
这适用于第一年/类别,因为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]}]
});
});
答案 0 :(得分:2)
您需要获取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,这会冗余地计算总数,如果你有很多数据点,这可能是一个问题。
在构建图表之前计算相关值,并将相应的百分比值与每个数据点一起作为可选变量发送,以便从数据标签中引用,这可能是值得的。
编辑-------------------
预处理数据并使用'totals'数组计算每个柱的百分比的示例,从而避免重复计算每个柱的相同总数: