Как получить индекс точки в Highcharts?

Я использую диаграмму "Временные данные с нерегулярными интервалами" в Highcharts. Как вы знаете, когда мышь перемещается по точкам линии, функция форматирования запускается и отображает некоторую информацию. Я хочу знать индекс точки, над которой движется мышь. Поэтому, если мышь перемещается по первой точке линии, всплывающая подсказка показывает "1", а вторая точка показывает "2" и так далее. Thnx.

Ответы

Ответ 1

Это работало для меня, используя v2.2:

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

Ответ 2

Один из способов - предварительно обработать данные, чтобы содержать свойство с индексом. В примере с глубиной снега вы можете сделать такой вид:

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

Ответ 3

Для записи вы можете сделать это напрямую красивым способом.

Он хранится в:

this.points[0].point.x

Ответ 4

Поскольку данные сортируются, вы можете использовать двоичный поиск .

Бинарный поиск должен хорошо работать даже для большого количества точек (из статьи в википедии: "Например, для поиска списка из миллиона элементов требуется целых миллион итераций с линейным поиском, но никогда больше чем двадцать итераций с бинарным поиском.

Пример:

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/)

Ответ 5

Похоже, вам нужно только значение xAxis (т.е. время). Использование: this.xData.indexOf(point.x)

this.points будут сгруппированы в большие ряды, поэтому потребуется более глубокий поиск по точкам [0]... points [n].

Ответ 6

Это все, что сработало для меня в Highstock JS v4.2.4:

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

Ответ 7

Это примерно так же храбрый, как и он, и будет медленно, как ад, с множеством очков, но он будет работать. Общая идея состоит в том, чтобы просмотреть все точки в данных серии, пока не найдете тот, который соответствует текущей точке:

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/