2014-05-16 11 views
5

Mam zestaw danych taki, że po posortowaniu w porządku rosnącym kręgi kończą się "ułożone", ale będą wyglądały prawidłowo rozmieszczone przy użyciu zerowej lub malejącej kolejności sortowania.d3.layout.pack układa kręgi w sortowaniu rosnącym

ascending

descending

null

Kompletna przykładem jest tutaj: http://jsfiddle.net/SXLHx/3/.

Ktoś ma sugestię?



    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); 

Niektóre dodatkowe info:

stwierdziliśmy, że jeśli usunąć przynajmniej dwa wpisy bloki, które mają wartość 0 (nie ma znaczenia, który dwa, ale to musiało być dwa) układ jest w porządku. http://jsfiddle.net/SXLHx/4/

również zastosowanie filtra nie dołączyć kręgi z 0 wartości tak:



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

nie rozwiąże problemu układu. Może filtruję nieprawidłowo?

+0

Wygląda jak błąd. –

+0

Musimy zbadać dalej. Kolejność rosnąca działa w tym [plunk] (http://plnkr.co/edit/npUSyrG8sHsQrqUPw7Y7?p=preview), który jest oparty na tym [przykład] (http://bl.ocks.org/mbostock/4063530) . – FernOfTheAndes

Odpowiedz

4

Po prostu masz kilka błędów w części kodu, która ma ustawić nowe zamówienie i zaktualizować układ. Powinno to wyglądać tak: (to jest jeszcze prostsze niż to, co jest obecnie w kodzie)

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;}); 

Rozwiązałem wartości zerowych z tej linii w inicjalizacji opakowanie:

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

Oto jsfiddle.

Oto wideo z egzekucji:

enter image description here

(zauważ, że po trzecim przycisk-press, koła nie wracają do pierwotnego porządku, ale wynika to z innych powodów, które nie mają bezpośredniego połączenia do oryginalnego problemu (który dotyczy porządku rosnącego/malejącego w pakiecie koła)).

Mam nadzieję, że to pomoże.

+0

To zadziała w moim przypadku użycia. Dziękuję za poprawki do mojego zamówienia, aktualizacji i filtrowania. Nadal uważam, że coś jest nie tak z D3, ponieważ bez części filtrującej uszkodzony układ zależy od obecności co najmniej trzech wartości 0 w danych. Jeśli usunę dwie z vals, układ jest w porządku. – user1052313

+0

Jak spakować kręgi z efektem ruchomym, tak jak w wymuszonym pakiecie okręgów układu. ?? – user2339182

Powiązane problemy