2012-07-06 14 views
17

Intenté fijar ambos nodos y enlaces al mismo tiempo de esta manera:d3.js: "No se puede leer 'peso' de la propiedad indefinido" al definir manualmente los dos nodos y enlaces para la disposición de la fuerza

var force = d3.layout.force() 
    .size([w, h]) 
    .nodes(nodes) 
    .links(connections) 
    .start(); 

nodes = [{"name":"data_base_id", "kind":"subgenre"},...] 
connections = [{"source":"name_of_node", "target":"name_of_other_node"},...] 

tengo datos que pueden no tener conexiones, por lo que es necesario definir los nodos, de modo que todos los nodos se procesen. Y definir los géneros es bastante fácil. pero obtengo este error;

Cannot read property 'weight' of undefined 

Y cuando comento hacia fuera .links (conexiones) presta el gráfico (se proyecta un montón de puntos dispersos por todo ...) ¿Cómo puedo obtener el conexiones/enlaces para cooperar con d3?

Estaba leyendo los documentos, y aparentemente el origen y el objetivo tienen que ser INDICES de los nodos en la matriz de nodos. ¿Hay alguna forma de cambiar eso? Entonces, ¿puedo usar el nombre de un nodo en lugar del índice que tiene en una matriz?

Respuesta

8

El diseño dirigido a la fuerza utiliza pesos de borde para calcular el diseño. Intente agregar un dummy "weight":1 a todas sus conexiones.

El código que inicializa los enlaces se parece a esto:

links.forEach(function(d) { 
    if (typeof d.source == "number") { d.source = nodes[d.source]; } 
    if (typeof d.target == "number") { d.target = nodes[d.target]; } 
}); 

Es de suponer que podría ajustar que (en la fuente d3) a utilizar la propiedad/tipo.

4

Creo que puede tener valores nulos en su fuente y destino. También tuve este error y lo solucioné filtrando los valores nulos.

16

Me encuentro con el mismo problema antes, es debido a que hay valores nulos en el origen/destino de los enlaces. de impresión fuera nodos y enlaces información podría ayudar a depurar

1

que he tenido este problema pop-up en un número de maneras. Más recientemente, tenía mi lista de aristas de la siguiente manera:

{Source: 0; Target: 1} 

en lugar de:

{source: 0, target: 1} 
10

Además de las respuestas que mencionan el nulo en el origen/destino de los enlaces, la razón de esto podría ser la asignación de una fuente/objetivo fuera de rango. P.ej. tiene 10 nodos y asigna el objetivo para ser el 11 ° nodo indexado.

+0

tengo este problema, ¿cómo hago para no tirar el error si no puedo encontrar el nodo en mis datos? – thatOneGuy

+0

como @air_bob dijo, puede imprimir si las asignaciones de enlaces van por encima de la cantidad de nodos – elachell

+0

Advertencia importante: JavaScript está indexado 0. Así que creo que el comentario correcto es "... tienes 10 nodos y asignas el objetivo (o fuente) para ser el décimo nodo indexado" – JHowIX

9

¡Gracias a las respuestas anteriores que hacen referencia a valores de origen o destino nulos!

He estado probando el gráfico desde http://bl.ocks.org/mbostock/4062045, y he encontrado que mis datos hacen referencia a un nodo faltante.

Esto puede ayudar a otros a depurar este problema:

d3.json("my-buggy-data.json", function(error, graph) { 

    // Find blank links, which give the error 
    // "Uncaught TypeError: Cannot read property 'weight' of undefined" 
    graph.links.forEach(function(link, index, list) { 
     if (typeof graph.nodes[link.source] === 'undefined') { 
      console.log('undefined source', link); 
     } 
     if (typeof graph.nodes[link.target] === 'undefined') { 
      console.log('undefined target', link); 
     } 
    }); 

    force 
     .nodes(graph.nodes) 
     .links(graph.links) 
     .start(); 
+1

Esto resuelve mi problema, ¡Gracias! –

Cuestiones relacionadas