J'utilise le tableau de Highcharts "Données temporelles avec intervalles irréguliers". Comme vous le savez lorsque la souris survole des points de la ligne, la fonction de formatage s'exécute et affiche certaines informations. Je veux connaître l'index du point sur lequel la souris passe dessus. Ainsi, si la souris survole le premier point de la ligne, l'info-bulle indique "1" et le deuxième point indique "2", etc. thnx.
Cela a fonctionné pour moi avec v2.2:
this.series.data.indexOf( this.point )
Une solution consiste à prétraiter les données pour qu'elles contiennent une propriété avec l'index. Dans l'exemple de profondeur de neige, vous pouvez effectuer une préparation comme celle-ci:
function prepare(dataArray) {
return dataArray.map(function (item, index) {
return {x: item[0], y: item[1], myIndex: index};
});
};
convertir le tableau de [x, y]
en un objet comme { x: x, y: y, myIndex: i}
. Ensuite, il est facile de récupérer cet index dans le formateur avec:
formatter: function() {
return 'point ' + this.point.myIndex;
}
Exemple sur jsfiddle
Pour mémoire, vous pouvez le faire directement de façon agréable
Il est stocké dans:
this.points[0].point.x
Les données étant triées, vous pouvez utiliser une recherche binaire .
Une recherche binaire devrait bien fonctionner même pour un grand nombre de points (extrait de l'article de Wikipédia: "Par exemple, rechercher dans une liste d'un million d'éléments prend jusqu'à un million d'itérations avec la recherche linéaire, mais jamais plus de vingt itérations avec recherche binaire . "
Exemple:
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;
}
}
(la fonction binarySearch ci-dessus est inspirée par http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/ )
On dirait que vous n’avez besoin que de la valeur xAxis (c’est-à-dire le temps). Utilisation: this.xData.indexOf(point.x)
ces points seront regroupés en grandes séries et nécessiteront donc une recherche plus approfondie entre les points [0] ... points [n].
C'est tout ce qui a fonctionné pour moi sur Highstock JS v4.2.4:
var index = this.points[0].point.dataGroup.start;
C’est à peu près le même hacky qu’il vient, et ça va devenir lent comme bonjour avec beaucoup de points, mais ça va marcher. L'idée générale est de parcourir tous les points des données de la série jusqu'à trouver celui qui correspond au point actuel:
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'
}
}
Exemple live: http://jsfiddle.net/Fuv4h/
Si vous avez accès à votre point, vous pouvez y accéder simplement, this.point.index
ou simplement this.index
si this
fait référence au point où il a lui-même Accès à son index,
Dans mon cas, je l’utilise toujours parce que c’est plus simple que la solution @ Edgar, ce qui est également très bien.