Как получить индекс точки в Highcharts? - PullRequest
17 голосов
/ 14 декабря 2011

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

Ответы [ 8 ]

62 голосов
/ 31 мая 2012

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

this.series.data.indexOf( this.point )
12 голосов
/ 14 декабря 2011

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

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

5 голосов
/ 04 марта 2012

Для записи, вы можете сделать это прямо хорошим способом

Это магазин в:

this.points[0].point.x
2 голосов
/ 27 июня 2012

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

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

Пример:

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

1 голос
/ 29 мая 2016

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

var index = this.points[0].point.dataGroup.start;
1 голос
/ 03 ноября 2014

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

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

0 голосов
/ 24 апреля 2018

Если у вас есть доступ к вашей точке, то вы можете просто получить доступ, this.point.index или просто this.index, если this относится к точке, в которой она самостоятельно получает доступ к своему индексу,

В моем случаеЯ всегда использую это, потому что это более простое решение, чем @Edgar, что тоже здорово.

0 голосов
/ 14 декабря 2011

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

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...