2012-08-07 21 views
6

Estoy adentrándome en el apasionante mundo de los diseños dirigidos por la fuerza con d3.js. Tengo una idea de los fundamentos de d3, pero no puedo entender el sistema básico para configurar un diseño dirigido por la fuerza.Conceptos básicos del diseño dirigido por la fuerza de D3

En este momento, estoy tratando de crear un diseño simple con algunas burbujas inconexas que flotan en el centro. Muy simple, ¿verdad? Se crean los círculos con el correcto, pero no pasa nada.

Edición: el problema parece ser que force.nodes() devuelve la matriz de datos inicial. En las secuencias de comandos de trabajo, force.nodes() devuelve una matriz de objetos.

Aquí está mi código:

<script> 
    $(function(){ 

    var width = 600, 
     height = 400; 

    var data = [2,5,7,3,4,6,3,6]; 


    //create chart 
    var chart = d3.select('body').append('svg') 
     .attr('class','chart') 
     .attr('width', width) 
     .attr('height', height); 

    //create force layout 
    var force = d3.layout.force() 
     .gravity(30) 
     .alpha(.2) 
     .size([width, height]) 
     .nodes(data) 
     .links([]) 
     .charge(30) 
     .start(); 

    //create visuals 
    var circles = chart.selectAll('.circle') 
     .data(force.nodes()) //what should I put here??? 
     .enter() 
     .append('circle') 
     .attr('class','circles') 
     .attr('r', function(d) { return d; }); 

    //update locations 
    force.on("tick", function(e) { 
     circles.attr("cx", function(d) { return d.x; }) 
     .attr("cy", function(d) { return d.y; }); 
    }); 

    }); 


</script> 

Respuesta

3

Aquí estaba el problema. La matriz que alimenta en force.nodes(array) debe ser una matriz de objetos.

Así:

var data = [{number:1, value:20}, {number:2, value:30}...];

obras. O incluso sólo

var data=[{value:1},{value:2}];

hace que el trabajo fino guión.

0

Es necesario actualizar y cxcy en force.on manejador.

//update locations 
force.on("tick", function(e) { 

    circles.attr("cx", function(d) { return d.x - deltaX(d, e) ; }) 
    .attr("cy", function(d) { return d.y - deltaY(d, e); }); 
}); 

y funciones deltaX y deltaY depende del modelo de la fuerza.

+0

Pensé que el diseño de fuerza proporcionaba las ubicaciones actualizadas de d.x y d.y. ¿De dónde viene deltaX()? Estoy tratando de ver ejemplos de trabajo, y los ejemplos siempre están actualizando con return d.x – Alex

Cuestiones relacionadas