2012-03-12 15 views
20

Vorrei un grafico flusso come in questo esempio: http://mbostock.github.com/d3/ex/stream.htmlD3 in tempo reale streamgraph (grafico Data Visualization)

enter image description here

ma vorrei dati in tempo reale che entrano da destra e hanno dati vecchi partire da sinistra, in modo da avere sempre una finestra di 200 campioni. Come potrei fare in modo tale da avere le transizioni appropriate?

Ho provato a cambiare i punti di dati nella matrice una e poi ricreando un'area come tale

data0 = d3.layout.stack()(a); 

ma le transizioni non far sembrare il grafico è scorrevole attraverso lo schermo.

Grazie in anticipo.

risposta

33

Prova this tutorial:

Nell'attuare visualizzata in tempo reale di dati di serie, spesso usiamo l'asse x per codificare tempo posizione: il passare del tempo, nuovi dati provengono da destra, e vecchio i dati si spostano verso sinistra. Se si utilizza built-in path interpolators, tuttavia, è possibile vedere qualche comportamento sorprendente di D3 ...

per eliminare il wiggle, interpolare la trasformazione, piuttosto che il percorso. Questo ha senso se si pensa al grafico come alla visualizzazione di una funzione - il suo valore non sta cambiando, stiamo solo mostrando una parte diversa del dominio. Facendo scorrere la finestra visibile alla stessa velocità che arriva nuovi dati, si può visualizzare senza problemi i dati in tempo reale ...

+0

Grazie! Ho eseguito il tutorial, ma ho avuto molti problemi nel tentativo di estrapolarlo all'esempio del diagramma di flusso. Ho finalmente utilizzato questa riga di codice per spostare i miei percorsi multipli. vis.selectAll ("path"). Data (data0) .attr ("d", area) .attr ("transform", null) .transition(). Duration (50) .ease ("linear"). attr ("transform", "translate (" + -10 + ")"). each ("end", function (d, i) {if (i == 0) transition();}); Posso solo ricorsivamente chiamare la transizione sul primo percorso, altrimenti l'intero grafico si sposta una volta per everypath, e quindi ho un'esplosione di callback. C'è un modo migliore per farlo? Grazie! – klyngbaek

+0

Ho pubblicato il mio esempio qui: http://lyngbaek.com/real-time-stream-graph.html ogni tanto il "percorso" inferiore viene disallineato da quello "superiore", probabilmente dal modo in cui effettua la mia chiamata ricorsiva di transizione(). Ho estrapolato dal tutorial e creato un array di dati separato per i percorsi in alto e in basso. Quindi io personalmente spingo un nuovo valore a ciascuno di essi. Devo quindi ricalcolare un nuovo d3.layout.stack() e ridisegnarlo. Quindi sposto i miei 2 array di dati e ripeto. Questa è la metodologia corretta o esiste un modo più semplice per farlo. Grazie ancora! – klyngbaek

+0

Questa è la maggior parte di ciò che stavo cercando con la mia domanda qui: http: // stackoverflow.it/questions/12764813/production-a-live-graph-with-d3 Come si consiglia di ottenere i dati dal server al client? –

7

Ecco un semplice esempio: http://jsfiddle.net/cqDA9/1/ Esso mostra una possibile soluzione per tenere traccia e aggiornate le diverse serie di dati.

var update = function() { 
    for (Name in chart.chartSeries) { 
     chart.chartSeries[Name] = Math.random() * 10; 
    } 
    for (Name in chart2.chartSeries) { 
     chart2.chartSeries[Name] = Math.random() * 10; 
    } 
    setTimeout(update, 1000); 
} 
setTimeout(update, 1000);