2013-07-01 10 views
11

Ho un array o oggetti costituiti da una data e alcuni valori:ovviare alle carenze delle serie D3 nidificazione

var flatData = [ 
    { "date": "2012-05-26", "product": "apple" }, 
    { "date": "2012-07-03", "product": "orange" }, 
    ... 
] 

Sto cercando di utilizzare d3.nest() per ottenere un conteggio di questi oggetti per anno e poi per mese.

var nestedData = d3.nest() 
    .key(function(d) { return d.date.split('-')[0]; }) // key is the year 
    .sortKeys(d3.ascending) 
    .key(function(d) { 
     var splitDate = d.date.split('-'); 
     return splitDate[0] + '-' + splitDate[1]; // key is year-month 
    }) 
    .sortKeys(d3.ascending) 
    .rollup(function(d) { 
     return d.length; 
    }) 
    .entries(flatData); 

Questo quasi funziona, tranne che quando non ci sono oggetti per un mese, i dati nidificato non contiene un record che indica un conteggio di 0 per quel mese. C'è qualche trucco per dire a D3 di colmare queste lacune?

(Naturalmente, posso sempre farlo nel modo noioso, cioè a scorrere tutti i livelli nidificati e creare una nuova struttura di dati che riempie i vuoti.)

+0

Cosa intendi con riempiendo gli spazi vuoti, ovvero che conteggio vuoi che restituisca se non c'è niente? –

+1

Voglio che restituisca un oggetto con il conteggio di 0. In questo modo quando utilizzo le informazioni per disegnare un grafico a barre, c'è un record per ogni barra e posso semplicemente scorrere gli oggetti. L'approccio alternativo a cui stavo pensando non è quello di assumere un record per ogni barra e regolare di conseguenza l'algoritmo di rendering del grafico. – Naresh

+0

Non c'è niente in D3 per questo, ma è possibile inserire i valori mancanti ripetendo successivamente la struttura nidificata. –

risposta

5

Prova aggiungendo i punti di dati mancanti dopo la riduzione:

var flatData = [ 
    { "date": "2012-05-26", "product": "apple" }, 
    { "date": "2012-07-03", "product": "orange" }] 

nestedData = d3.nest() 
    .key(function(d) { return d.date.split('-')[0]; }) // key is the year 
    .sortKeys(d3.ascending) 
    .key(function(d) { 
     var splitDate = d.date.split('-'); 
     return splitDate[0] + '-' + splitDate[1]; // key is year-month 
    }) 
    .sortKeys(d3.ascending) 
    .rollup(function(d) { 
     return d.length; 
    }) 
    .entries(flatData); 


yMFormat = d3.time.format('%Y-%m') 

makeAllKeys = function(year) { 
    allKeys = []; 
    for(var i = 0; i<12;i++) { // 12 months in a year 
     allKeys.push(yMFormat(new Date(year,i,1))); 
    } 
    return allKeys; 
} 

nestedData = nestedData.map(function(yearObj) { 
    return { 
     values: makeAllKeys(+yearObj.key).map(function(k) { 
       value = yearObj.values.filter(function(v) { return v.key == k; })[0]; 
       return value || ({key: k, values: 0}); 
      }) 
    }; 
}); 
Problemi correlati