2009-07-23 16 views
36

Sto provando a produrre un grafico a linee usando Flot, ma voglio che le etichette dei dati vengano visualizzate sul grafico - cioè, voglio che il valore di ciascun punto appaia accanto a quel punto. Credo che questa dovrebbe essere un'opzione, ma non la trovo nell'API. Mi manca qualcosa o qualcuno conosce una soluzione alternativa?Etichette dati flottaggio

Grazie in anticipo.

risposta

43

Ecco come ho aggiunto la funzione, tra cui un piacevole effetto di animazione:

var p = $.plot(...); 

$.each(p.getData()[0].data, function(i, el){ 
    var o = p.pointOffset({x: el[0], y: el[1]}); 
    $('<div class="data-point-label">' + el[1] + '</div>').css({ 
    position: 'absolute', 
    left: o.left + 4, 
    top: o.top - 43, 
    display: 'none' 
    }).appendTo(p.getPlaceholder()).fadeIn('slow'); 
}); 

Puoi sposta la posizione e visualizza css in un foglio di stile.

+0

ha funzionato come un incantesimo grazie. – cmptrwhz

+0

Bel trucco, ma esiste un modo per rendere questi dati etichettati con le stesse dimensioni dei tick e con il centro di allineamento del testo? Perché o.left + 4 non si centra per alcuni valori. grazie. –

+2

Non perfetto, ma funziona ... Uso le barre orizzontali, quindi è necessario modificare el [1] in el [0] quando si esegue il rendering del valore.Grazie –

10

La funzione desiderata è richiesta here nel gruppo Flot Google. Non sembra che sia mai stato implementato (non c'è nulla nell'API su come inserire le etichette all'interno del grafico stesso). Penso che la risposta alla tua domanda sia che No, al momento non è possibile mostrare i valori accanto a determinati punti sulle linee all'interno del grafico.

Ole Larson, capo sviluppatore di Flot, ha detto che mostrare etichette all'interno del grafico è diverso da qualsiasi altro su FLOT e che dovrebbero pensare a come estendere i parametri API/plot per farlo.

Detto questo, potresti voler pubblicare una domanda sullo Flot forum o inviare un suggerimento sullo bug-tracker per la nuova funzione. Ole Larson è davvero bravo a riprendere da solo tutte le domande, i bug e i suggerimenti.

+2

Detto questo, Flot è open source, quindi puoi scrivere tu stesso la funzione se sei uno sviluppatore JS esperto. – thewillcole

+0

Grazie per questo. La mia esperienza di sviluppo di JS è relativamente minima, ma ci penserò su. Mi sento anche come se dovessi essere in grado di trovare una soluzione aggiungendo i dati in posizione fissa div vicino alla barra (a la tooltips, ma permanente), ma non ho ancora trovato un modo per scorrere i dati per ottenere X & Y coordinate. – Zeth

+0

Zeth, i div di posizione fissa sembrano una buona idea. Dovresti anche esaminare gli esempi Flot (su code.google.com/p/flot) per consultare il codice del suggerimento e il codice dell'evento al passaggio del mouse. Il codice del suggerimento potrebbe aiutare a scrivere le etichette e il codice dell'evento al passaggio del mouse potrebbe mostrarti come ottenere le posizioni delle barre. – thewillcole

4

Sembra che lo flot-valuelabels plugin sia un fork di un previous flot plugin - ma il codice biforcato rende le etichette sul canvas. Puoi vedere una demo di come appare nella pagina del wiki Github del plugin, here (sembra molto piacevole alla vista).

+0

grazie, funziona perfettamente per me! –

1
function redrawplot() { 
    $('.tt1').remove(); 
    var points = plot.getData(); 
    var graphx = $('#placeholder').offset().left; 
    graphx = graphx + 30; // replace with offset of canvas on graph 
    var graphy = $('#placeholder').offset().top; 
    graphy = graphy + 10; // how low you want the label to hang underneath the point 
    for(var k = 0; k < points.length; k++){ 
      for(var m = 1; m < points[k].data.length-1; m++){ 
      if(points[k].data[m][0] != null && points[k].data[m][1] != null){ 
        if ((points[k].data[m-1][1] < points[k].data[m][1] && points[k].data[m][1] > points[k].data[m+1][1]) && (points[k].data[m-1][1] - points[k].data[m][1] < -50 || points[k].data[m][1] - points[k].data[m+1][1] > 50)) { 
           showTooltip1(graphx + points[k].xaxis.p2c(points[k].data[m][0]) - 15, graphy + points[k].yaxis.p2c(points[k].data[m][1]) - 35,points[k].data[m][1], points[k].color); 
       } 
           if ((points[k].data[m-1][1] > points[k].data[m][1] && points[k].data[m][1] < points[k].data[m+1][1]) && (points[k].data[m-1][1] - points[k].data[m][1] > 50 || points[k].data[m][1] - points[k].data[m+1][1] < -50)) { 
           showTooltip1(graphx + points[k].xaxis.p2c(points[k].data[m][0]) - 15, graphy + points[k].yaxis.p2c(points[k].data[m][1]) + 2,points[k].data[m][1], points[k].color); 
           } 
          } 
     } 
     } 

} 

function showTooltip1(x,y,contents, colour){ 
    $('<div class=tt1 id="value">' + contents + '</div>').css({ 
     position: 'absolute', 
     display: 'none', 
     top: y, 
     left: x, 
     'border-style': 'solid', 
     'border-width': '2px', 
     'border-color': colour, 
     'border-radius': '5px', 
     'background-color': '#ffffff', 
     color: '#262626', 
     padding: '0px', 
     opacity: '1' 
    }).appendTo("body").fadeIn(200); 
} 
Problemi correlati