如何在Highcharts中获得一个点的索引?

时间:2011-12-14 16:07:53

标签: javascript highcharts

我正在使用Highcharts的“不规则间隔的时间数据”图表。如您所知,当鼠标在线上移动时,格式化程序功能会运行并显示一些信息。我想知道鼠标在它上面移动的点的索引。因此,如果鼠标移动到该行的第一个点,则工具提示显示“1”,第二个点显示“2”,依此类推。日Thnx。

8 个答案:

答案 0 :(得分:61)

这对我使用v2.2:

this.series.data.indexOf( this.point )

答案 1 :(得分:12)

一种方法是预处理数据以包含具有索引的属性。在Snow-depth示例中,您可以做这样的准备:

function prepare(dataArray) {
    return dataArray.map(function (item, index) {
        return {x: item[0], y: item[1], myIndex: index};
    });
};

[x, y]的数组转换为{ x: x, y: y, myIndex: i}之类的对象。然后很容易在格式化程序中获取该索引:

formatter: function() {
     return 'point ' + this.point.myIndex;
}

jsfiddle

上的示例

答案 2 :(得分:5)

对于记录,您可以直接以一种很好的方式进行记录

存储在:

this.points[0].point.x

答案 3 :(得分:2)

由于数据已排序,您可以使用binary search

二进制搜索即使对于大量的点也应该表现良好(来自维基百科文章:“例如,搜索一百万个项目的列表需要多达一百万次线性搜索迭代,但永远不会更多比二十次迭代二次搜索。“

示例:

var bsComparator = function(a, b) {
    if (a.x < b.x) { return -1; }
    if (a.x > b.x) { return 1; }
    return 0;
};
var binarySearch = function(series_data, point) {
    var low = 0, high = series_data.length - 1,
        i, comparison;
    while (low <= high) {
        i = Math.floor((low + high) / 2);
        comparison = bsComparator(series_data[i], point);
        if (comparison < 0) { low = i + 1; continue; }
        if (comparison > 0) { high = i - 1; continue; }
        return i;
    }
    return null;
};


tooltip: {
    formatter: function() {
        var pointIndex = binarySearch(this.series.data, this.point);
        return "Point index: " + pointIndex;
    }
}

(上面的binarySearch函数受http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/启发)

答案 4 :(得分:1)

听起来你只需要xAxis值(即时间)。使用: this.xData.indexOf(point.x)

this.points将被分组为更大的系列,因此需要通过点[0] ...点[n]进行更深入的搜索。

答案 5 :(得分:1)

在Highstock JS v4.2.4上,这一切对我有用:

var index = this.points[0].point.dataGroup.start;

答案 6 :(得分:0)

这就像它来的一样hacky,并且会因为很多积分而变慢,但它会起作用。一般的想法是查看系列数据中的所有点,直到找到与当前点匹配的点:

tooltip: {
     formatter: function() {
         for(var i=0;i<this.series.data.length;i++){
              var item = this.series.data[i];
              if(item.x == this.x && item.y == this.y)
               return 'point ' + i;
         }
         return 'not found'
     }
  }

实例:http://jsfiddle.net/Fuv4h/

答案 7 :(得分:0)

如果您有权访问您的观点,那么您可以轻松访问, this.point.index或仅this.index如果this指的是自己的观点 访问其索引,

在我的情况下,我总是使用它,因为它比@Edgar解决方案更简单,这也很棒。