2012-07-06 9 views
17

のためにノードとリンクの両方を定義するとき、私は同時に、このようにノードとリンクの両方を設定してみました:d3.js:「未定義のプロパティを読み取ることができません 『重み』」手動力レイアウト

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"},...] 

私が持っています接続がない可能性のあるデータなので、すべてのノードがレンダリングされるようにノードを定義する必要があります。ジャンルを定義するのはかなり簡単です。 このエラーが発生します。

Cannot read property 'weight' of undefined 

そして、私は.links(接続)をコメントアウトしたときにグラフがレンダリング(...に点在するドットの束を突き出)はどのように私はD3と協力するの接続/リンクを得るのですか?

私はドキュメントを読んでいました。明らかに、ソースとターゲットはノード配列のノードのINDEXESでなければなりません。それをどうにか変えてもらえますか?だから、配列の中にあるインデックスではなく、ノードの名前を使うことができますか?

答えて

8

力指向のレイアウトは、エッジの重みを使用してレイアウトを計算します。すべての接続にダミーの"weight":1を追加してみてください。

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

おそらくあなたが任意のプロパティ/タイプを使用する(D3ソースで)それを微調整できます。

リンクを初期化するコードは次のようになります。

4

ソースとターゲットにnull値が含まれている可能性があります。私はこのバグも抱えていて、ヌル値を除外して修正しました。

16

前に同じ問題が発生しました。リンクのソース/ターゲットにnull値があるためです。 プリントアウトノードリンク情報は、私はこの問題は、いくつかの方法でポップアップしなければならなかった

1

デバッグするのに役立つかもしれません。

{Source: 0; Target: 1} 

の代わりに:次のように最近では、私は私のエッジリストを持っていたリンクのソース/ターゲットにヌルを言及するの回答に加えて

{source: 0, target: 1} 
10

、この理由は以下のようになり範囲外のソース/ターゲットの割り当て。例えば。 10個のノードがあり、11番目の索引ノードになるようにターゲットを割り当てます。

+0

私は私が私のデータ内のノードを見つけることができない場合はエラーを投げないで行くのですか、この問題がありますか? – thatOneGuy

+0

@air_bobと言っていますが、リンク数がノード数を超えている場合は、印刷することができます – elachell

+0

重要な警告:JavaScriptはインデックスに登録されています。だから私は適切なコメントは "..あなたは10のノードを持っており、ターゲット(またはソース)を10番目のインデックスノードに割り当てる"と考えています。 – JHowIX

9

nullのソースまたはターゲット値を参照する上記のおかげで!

私はhttp://bl.ocks.org/mbostock/4062045からグラフをテストしていますが、自分のデータが欠落しているノードを参照していることがわかりました。

これは、他の人がこの問題のデバッグに役立つことがあります。

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

これは私の問題を解決します、ありがとう! –

関連する問題