2015-10-15 13 views
0

Я новичок в d3js, и у меня возникли проблемы с отображением файла csv на ссылки макета силы.Почему моя функция d3 map возвращает неопределенный атрибут источника?

это мой CSV-файл:

node,edges,centrality_degree 
1,"[(1, 2), (1, 3), (1, 4), (1, 5)]",1.0 
2,"[(2, 1), (2, 3), (2, 4), (2, 5)]",1.0 
3,"[(3, 1), (3, 2), (3, 4), (3, 5)]",1.0 
4,"[(4, 1), (4, 2), (4, 3), (4, 5)]",1.0 
5,"[(5, 1), (5, 2), (5, 3), (5, 4)]",1.0 

Я хочу, чтобы установить значение ребер атрибута звеньев d3.layout.force(), однако при отображении значения, я получаю сообщение об ошибке :

Uncaught TypeError: Cannot read property 'weight' of undefined

я не знаю, и если это правильно возвращать массив с кучей объектов, это то, что я получаю на консоли. 5 массивов с 4 объектами каждый, каждый объект с его атрибутом источника и цели. Все атрибуты правильны, за исключением массива 5. Я получаю неопределенное значение для первого исходного значения. Он должен был быть 5.

Вот мой код:

var force = d3.layout.force() 
    .size([w, h]); 

d3.csv("{{ g }}", function(d) { 

    var nodes = d3.values(d.map(function(d){ return +d.node; })); 

    var links_list = d.map(function(d) { 

     list_array = JSON.parse(d.edges.replace(/\(/g,"[").replace(/\)/g,"]")); 

     var i, len = list_array.length; 

     links = []; 

     for (i=0; i<len; i++) { 
      links.push({source: list_array[i][0] ,target: list_array[i][1] }); 
     } 

     console.log(links); 

     #console result: 
     #[Object, Object, Object, Object] 
     #[Object, Object, Object, Object] 
     #[Object, Object, Object, Object] 
     #[Object, Object, Object, Object] 
     #expanding one array: 
      #0: Object 
      #1: Object 
      #2: Object 
      #3: Object 
     #[Object, Object, Object, Object] 
      #expanding the array[5][0] object: 
      #0: Object 
       #source: undefined 
       #target: 2 
       #__proto__: Object 

    }); 

    force 
     .nodes(nodes) 
     .links(links) 
     .start(); 

... 

}); 

Что я делаю не так, и почему я получаю эту ошибку?

Я ценю вашу помощь.

+1

Номера, которые вы указываете как источник и цель для ссылок, должны быть индексами в массиве узлов, а не идентификаторами узлов. Они начинаются с 0, а не с 1. Если вы хотите использовать идентификаторы, см. Https://stackoverflow.com/questions/23986466/d3-force-layout-linking-nodes-by-name-instead-of-index –

+0

@LarsKotthoff, это индексы для массива. Число 0 является ссылкой для первого элемента массива на консоли. –

+1

Цифры в ваших данных нет - они начинаются с 1 и идут до 5 для 5 узлов. –

ответ

1

The values of the source and target attributes should be specified as indexes into the nodes array; these will be replaced by references after the call to force start.

Обратите внимание, что индексы массива начинаются с 0, а не с 1. Но в ваших данных из CSV-файла, у вас есть ссылки как (5, 1), (5, 2), (5, 3), (5, 4) и ваши узлы массив имеет только 5 элементов; индекс последнего элемента будет равен 4. Вы должны были уменьшить эти числа до 1, чтобы представить фактические узлы.

Например:

var nodes = [{ name: "A", id: 1},{ name: "B", id: 2}]; 

макет силы рассчитывает массив ссылок, как показано ниже.

var links = [{ source:0, target: 1 }]; 

Надеюсь, у вас возникла проблема. Вам нужно будет сделать, как показано ниже, чтобы получить фактические индексы.

for (i=0; i<len; i++) { 
    links.push({source: list_array[i][0]-1 ,target: list_array[i][1]-1 }); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^