如何使用' datetime'来获取正确的堆栈标签轴?

时间:2014-07-16 20:24:17

标签: javascript highcharts

首先,我的问题的答词在这里:http://jsfiddle.net/pfifas/aTh7F/

问题

我想在横轴上的每个点显示所有系列的值的总和,作为每个堆栈上方的堆栈标签。因为我有负片并且我不想分别在上方和下方显示正负总数,所以我手动设置了格式化程序功能(小提琴中的第42到50行)。我想要的堆栈标签应该是给定点上所有值的总和,即正堆栈的总和减去所有负堆栈的总和。例如。如果第一点的数据系列是

data: [1,-2,3,4]

我希望堆栈标签显示" 6"在堆积的酒吧上方。我的格式化程序函数适用于排序

的数据系列
data: [1,-2,3,4]

但是,一旦我为每个系列添加日期变量,如

data: [
[Date.UTC(2010, 0, 1), 4],
[Date.UTC(2010, 3, 1), 15],
[Date.UTC(2010, 6, 1), 17],
[Date.UTC(2010, 9, 1), 10]
]

不再显示堆栈标签。我想我在格式化函数中对数组的索引做错了。如何更改索引以获得正确的结果?

另外,在哪里可以了解格式化程序环境中哪些变量可用以及如何在高级图表中处理它们?

编辑:

在回答Onkloss的回答时,我应该强调这个问题与将轴设置为'datetime'类型有关,而不是数据数组是否是多维的(如前一个问题标题所暗示的那样)。

2 个答案:

答案 0 :(得分:1)

如果我理解您正确要求的内容,则以下格式化程序功能应该起作用:

        formatter: function () {
            return this.total >= 0 ?this.total : null ;
        },

http://jsfiddle.net/aTh7F/1/

对于formatter函数中的可用选项,http://api.highcharts.com/highcharts#plotOptions.column.dataLabels.formatter应该有所帮助。但是,我倾向于在函数中放置一个断点并检查this是什么。 :)

答案 1 :(得分:1)

问题是在这里使用this.x

for (i = 0; i < 4; i++) {
    sum += series[i].yData[this.x];
}

对于&#34;正常&#34;由于您可以按索引打开yData,因此x轴类型很有效。在你的情况下,它最终会试图找到像series[0].yData[1262304000000]这样的东西,但它不会起作用。

我不知道有什么简单的方法可以找到时间戳this.x与x轴上的索引之间的关系。我的解决方案使用另一个for循环来比较this.xxData数组的时间戳,如果匹配,我们使用总和中的数据,如此更新的formatter所示:

formatter: function () {
    // If doing negative, ignore
    if(this.total <= 0)
        return;

    var sum = 0;
    var series = this.axis.series;

    for (var i = 0; i < series.length; i++){
        for(var j = 0; j < series[i].xData.length; j++) {
            if(series[i].options.type == 'column' && series[i].xData[j] == this.x) {
                sum += series[i].yData[j];
                break;
            }
        }
    }

    return sum;
}

updated JSFiddle显示了它的实际效果。