有几种解决方案可以实现这一点,其中之一是在afterSetExtremes 事件中重新渲染标签:http://jsfiddle.net/UaaZ3/
xAxis: {
events: {
afterSetExtremes: function () {
var chart = this.chart,
legend = chart.legend,
merge = Highcharts.merge;
// force redraw each element in legend
this.chart.isDirtyLegend = true;
for (var i in legend.allItems) {
var item = legend.allItems[i];
item.legendItem.destroy(); // destroy previous label
item.legendItem = chart.renderer.text(
legend.options.labelFormatter.call(item),
legend.symbolWidth + legend.options.symbolPadding,
legend.baseline)
.css(merge(item.visible ? legend.itemStyle : legend.itemHiddenStyle))
.attr({
align: 'left',
zIndex: 2
})
.add(item.legendGroup); // add new label
}
this.chart.redraw(false); // redraw chart, just in case
}
}
},
还有labelFormatter:
labelFormatter: function () {
var total = 0,
data = this.processedYData ? this.processedYData : this.yData; // series is rendered, or first render
for (var i = data.length; i--;) {
total += data[i];
};
return this.name + '- Total: ' + total;
},
此外,现在您正在使用 rangeSelector 中的选定选项。对你来说不幸的是,首先呈现的是带有系列的图例,然后完成了系列的计算。为避免这种情况,请删除选定的选项,并在 chart.events.load 中使用 chart.setExtremes() 强制更新图例。
编辑:
为防止出错,我开发了更好的解决方案,请参阅:http://jsfiddle.net/UaaZ3/3/
格式化程序:
function getLegendFormat(serie) {
var total = 0,
data = serie.processedYData ? serie.processedYData : serie.yData; // series is rendered, or first try?
for (var i = data.length; i--;) {
total += data[i];
};
return serie.name + '- Total: ' + total;
}
AdterSetExtremes:
xAxis: {
events: {
afterSetExtremes: function () {
var chart = this.chart,
legend = chart.legend;
for (var i in legend.allItems) {
var item = legend.allItems[i],
newText = getLegendFormat(item);
item.legendItem.attr({ text: newText })
}
}
}
},
labelFormatter:
labelFormatter: function () {
return getLegendFormat(this);
},