2014-05-16 11 views
5

Ho un set di dati tale che se ordinati in ordine crescente i cerchi finiscono "impilati" ma appaiono correttamente distribuiti quando si usa un ordinamento nullo o decrescente.d3.layout.pack impila i cerchi quando l'ordinamento è crescente

ascending

descending

null

esempio completo è qui: http://jsfiddle.net/SXLHx/3/.

Qualcuno ha un suggerimento?



    sortItems = function(a,b) { 
     var str,result; 
     switch(sortOrder%3){ 
      case 0: 
       str = 'ascending'; 
       result = a.size - b.size; 
       break; 
      case 1: 
       str = 'descending'; 
       result = b.size - a.size; 
       break; 
      default: 
       str = 'null'; 
       result = null; 
     } 
     document.getElementById("sortLbl").innerHTML = str; 
     return result; 
    }; 

    pack = d3.layout.pack().sort(sortItems); 

Alcune informazioni aggiuntive:

ho scoperto che se tolgo almeno due delle voci blocchi che hanno il valore 0 (non importa che due, ma che doveva essere due) il layout è bene. http://jsfiddle.net/SXLHx/4/

Inoltre, applicando un filtro per non accodare cerchi con valore 0 in questo modo:



    // Create circles 
    node.append("circle") 
     .filter(function(d){return d.size > 0;}) 
     .attr("r",function(d){return d.r;}); 

non risolve il problema di layout. Forse sto filtrando in modo errato?

+0

Sembra un insetto per me. –

+0

Dobbiamo approfondire ulteriormente. L'ordine crescente funziona in questo [plunk] (http://plnkr.co/edit/npUSyrG8sHsQrqUPw7Y7?p=preview), che è basato su questo [esempio] (http://bl.ocks.org/mbostock/4063530) . – FernOfTheAndes

risposta

4

Hai solo un paio di errori nella parte di codice che dovrebbe impostare un nuovo ordine e aggiornare il layout. Esso dovrebbe essere così: (è ancora più semplice di quello che è attualmente nel codice)

pack 
    .sort(sortItems) 
    .nodes({blocks:data}); 

node 
    .attr("transform",function(d){ 
     return "translate("+d.x+","+d.y+")"; 
    }) 
    .selectAll("circle") 
    .attr("r",function(d){return d.r;}); 

ho risolto i valori zero con questa linea di inizializzazione del pacchetto:

.value(function(d){return Math.max(0.01, d.size);}); 

Ecco jsfiddle.

Ecco spiacevole esecuzione:

enter image description here

(notare che dopo terzo pulsante-press, cerchi non ritornano ordine originale, ma ciò è dovuto ad altri motivi che non hanno connessione diretta al problema originale (che riguarda l'ordine ascendente/discendente in circle pack)).

Spero che questo aiuti.

+0

Questo funzionerà per il mio caso d'uso. Grazie per le correzioni del codice al mio ordine, aggiornamento e filtro. Continuo a pensare che ci sia qualcosa di sbagliato in d3 anche se dato che senza la parte filtrante il layout corrotto dipende dalla presenza di almeno tre valori 0 nei dati. Se rimuovo due degli 0 val, il layout va bene. – user1052313

+0

Come posso impacchettare cerchi con effetti in movimento proprio come nel pacchetto di circoli di forza. ?? – user2339182