2012-05-01 18 views
6

Ho seguito le istruzioni a: http://bost.ocks.org/mike/path/ per creare e animare singoli grafici con linee singole.d3.js - transform & transition, multiple lines

E, capito come creare più linee in un grafico: Drawing Multiple Lines in D3.js

Problema principale: Sto avendo un momento difficile transizione più righe dopo sposto & spinta a nuovi dati nel mio array di dati.

ho creare il N linee con: (tempo: tempo di un'epoca, si fa avanti)

var seriesData = [[{time:1335972631000, value:23}, {time:1335972631500, value:42},...], 
        [{time:1335972631000, value:45}, {time:1335972631500, value:13},...], 
        [{time:1335972631000, value:33}, {time:1335972631500, value:23},...}], 
        [...],[...],... 
        ]; 

var seriesColors = ['red', 'green', 'blue',...]; 

line = d3.svg.line() 
     .interpolate(interpolation) 
     .x(function(d) { return x(d.time); }) 
     .y(function(d) { return y(d.value); }); 

graphGroup.selectAll(".line") 
     .data(seriesData) 
      .enter().append("path") 
      .attr("class", "line") 
      .attr("d", line) 
      .style('stroke', function(d, i) { return seriesColors[i]; }) 
      .style('stroke-width', 1) 
      .style('fill', 'none'); 

e sto cercando di aggiornare N linee con un Javascript setInterval (...) chiamando un metodo con:

graph.selectAll("path") 
    .data(seriesData) 
    .attr("transform", "translate(" + x(1) + ")") 
    .attr("d", line) 
     .transition() 
    .ease("linear") 
    .duration(transitionDelay) 
    .attr("transform", "translate(" + x(0) + ")"); 

Può disegnare perfettamente il set iniziale, ma non appena eseguo l'aggiornamento mangiato l'array di dati, le linee scompaiono.


AGGIORNAMENTO 01

mi sono reso conto che sto usando valori temporali epoca nella x (asseX mostra Data: tempo) come il mio esempio probabilmente funziona se ho usato il seriesData illustrativo sopra.

Il problema era "trasformare", "tradurre" utilizzando x (1), x (0) restituiva numeri enormi, modo più grande del mio grafico necessario per la transizione.

ho modificato il aggiornamentoN metodo linee (sopra) per utilizzare un approccio manuale:

nuovo numero: Ora grafico si sposta a sinistra in modo corretto, ma le linee/grafico pop indietro a destra, viene eseguito ogni aggiornamento di SetInterval.

Fa push/shifting della serie Data array correttamente ma non continua a scorrere verso sinistra per mostrare i nuovi dati che sono effettivamente disegnati.

graph.selectAll("path") 
     .data(seriesData) 
     .attr("d", line) 
     .attr("transform", null) 
      .transition() 
     .ease("linear") 
     .duration(2000) 
     .attr("transform", "translate(-200)"); 

Un altro riferimento che ho usato è questo: http://bl.ocks.org/1148374

Qualche idea?

+0

Sto iniziando a pensare che questo abbia a che fare con il mio uso di d3.time.scale() ... per x vs. d3.scale.linear() ...? – August

+0

Hai mai risolto questo? Se è così, per favore pubblica la tua soluzione. –

+0

Ho finito per creare tre grafici separati con una singola riga ciascuno. Quindi uso i CSS per impilare gli ID dei grafici uno sopra l'altro. Era più facile da gestire e riutilizzare. Soprattutto se volevo che fosse liscia .. – August

risposta

1

Una cosa che salta fuori di me come una possibilità di errore è le chiamate dati che vengono utilizzati, l'iniziale è

.data(seriesData) 

l'aggiornamento utilizza

.data([seriesData]) 

che può causare problemi, ma è difficile dirlo senza vedere il resto di ciò che sta succedendo, puoi forse metterlo su jsfiddle?

+0

Ottima osservazione, ma non risolve il problema di aggiornamento. – August

+0

I [dati] provengono da questo esempio: http://bl.ocks.org/1148374 – August

+1

Quindi presumo che questo significhi quando si modifica la seconda chiamata dati in modo che corrisponda alla prima, non cambia nulla? - ci sono certamente casi in cui vorresti passare tutti i tuoi dati come una singola matrice di elementi, ma questo non sembra essere uno di quelli, da quello che posso dire. Temo di non poter fare molto di più senza vedere altro del codice. – Josh