2011-12-14 12 views
16

Sto utilizzando la tabella "Dati temporali con intervalli irregolari" di Highcharts. Come sapete quando il mouse si sposta su punti di linea, la funzione di formattazione viene eseguita e mostra alcune informazioni. Voglio sapere l'indice del punto in cui il mouse si muove su di esso. Quindi, se il mouse si sposta sul primo punto della linea, il suggerimento mostra "1" e il secondo punto mostra "2" e così via. thnx.Come ottenere l'indice di un punto in Highcharts?

+2

risposta di Edgar sembra essere il migliore, senza elaborazione richiesta. –

risposta

58

questo ha lavorato per me usando v2.2:

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

Ha funzionato anche per me. Semplice! –

+3

eccellente, breve e semplice !!!. anche se non credo tu abbia bisogno del ** this.point ** (tra parentesi), solo ** questo ** –

+0

Questa dovrebbe essere la risposta accettata. La risposta accettata è un brutto scherzo. –

0

Questo è un po 'hacky come viene, e diventerà lento con un sacco di punti, ma funzionerà. L'idea generale è quella di guardare attraverso tutti i punti dei dati della serie fino a trovare quello che corrisponde al punto corrente:

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' 
    } 
    } 

vivo esempio: http://jsfiddle.net/Fuv4h/

+0

Questo è esattamente quello che voglio. Ma come hai detto questo codice impiega così tanto tempo ad eseguirlo specialmente quando la linea è piena di punti. A proposito, ti ringrazio. – Morteza

11

Un modo è quello di pre-elaborare i dati a contenere una proprietà con l'indice Nell'esempio neve profonda che si possa fare una preparazione come questo:

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

per convertire la matrice di [x, y] ad essere un oggetto come { x: x, y: y, myIndex: i}. Poi il suo facile da prendere che indice nel formattatore con:

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

Esempio su jsfiddle

+1

Questo codice sembra più veloce. Lo collaudo nel mio progetto non appena posso. Thnx Eolsson. – Morteza

+0

Sì, dovrebbe essere più veloce della ricerca dell'indice, ma utilizzerà più memoria. – eolsson

+1

Wow ..Ora sono venuto a sapere che posso aggiungere più attributi oltre al nome, x, y, nota nell'array di oggetti. +1 per quello –

4

Per la cronaca il tuo grado di farlo direttamente in un modo carino

Si tratta di conservare in:

this.points[0].point.x 
+0

Questo funziona per me, non so perché hai downvoted. – MightyPork

+0

Posso dirti esattamente perché questo è stato downvoted: perché si basa sul contenuto di X per essere un indice. Nel mio caso X era un appuntamento, quindi ho ricevuto le date. Comunque usando 'seriesMapping' ho mappato la terza colonna del mio CSV ad un indice reale e poi l'ho acceduto usando questa linea :) +1 da me –

1

Poiché i dati sono ordinati, è possibile utilizzare uno binary search.

Una ricerca binaria dovrebbe funzionare bene anche per un numero elevato di punti (dall'articolo di Wikipedia: "Ad esempio, per cercare un elenco di un milione di elementi richiede più di un milione di iterazioni con ricerca lineare, ma mai più di venti iterazioni con ricerca binaria "

Esempio:.

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 funzione binarySearch sopra si ispira http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/)

1

Sou nds come te ha solo bisogno del valore xAxis (ad es. tempo). Utilizzare: this.xData.indexOf(point.x)

questo.punti saranno raggruppati in serie più grandi quindi sarebbe necessaria una ricerca più approfondita attraverso i punti [0] ... punti [n].

1

Questo è tutto ciò che ha funzionato per me su Highstock JS v4.2.4:

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