2016-03-23 15 views
1

Stephen Thomasのガイドhttps://github.com/sathomas/jsDataV.is-source/tree/master/ch7/forceに基づいて、d3 forceレイアウトグラフを作成しようとしました。D3 - 位置決めエッジでNaNエラーが発生する

しかし私は、私がその起源とそれに取り組む方法を知らないという間違いで立ち往生しています。

考えるplunker http://plnkr.co/edit/Bx0qe8DNEsnFgLhkxbfS?p=preview以下、このスニペットが原因となっている

var positionEdge = function(edge, nodes) { 
     edge.attr("x1", function(d) { return d.source.x; }) 
       .attr("y1", function(d) { return d.source.y; }) 
       .attr("x2", function(d) { return d.target.x; }) 
       .attr("y2", function(d) { return d.target.y; }); 
    }; 

多くのエラー例えばエラー:すべての原因は何

var edges = []; 
     links.forEach(function(srcLink){ 
      var targetNodeId; 
      var targetNodeName; 
      var sourceNodeId; 
      var sourceNodeName; 

      nodes.forEach(function(srcNode){ 
       if(srcNode.label === srcLink.source){ 
        sourceNodeId = srcNode.id; 
        sourceNodeName = srcNode.label; 
       } else if(srcNode.label === srcLink.target){ 
        targetNodeId = srcNode.id; 
        targetNodeName = srcNode.label; 
       } 
      }) 
      edges.push({ 
       "id": "From_" + sourceNodeName + "_To_" + targetNodeName, 
       "target": targetNodeId, 
       "source": sourceNodeId 
      }); 
     }) 

     // remove duplicate edges 
     var arr = {}; 
     for (var i=0, len=edges.length; i < len; i++) 
      arr[edges[i]['id']] = edges[i]; 

     edges = new Array(); 
     for (var key in arr) 
      edges.push(arr[key]); 

:=「NaNの」

属性Y2の値が無効です、私は次のように私のエッジの配列を構築しますが、完全に問題を再現できるようにするには、plunkerのリンクをご利用くださいpositionEdge関数が呼び出されたときにNaNエラーがスローされますか?

答えて

1

エッジのフィールドは、オブジェクトではなくノードIDです。

  • 使用オブジェクト:

    edges.push({ 
         "id": "From_" + sourceNodeName + "_To_" + targetNodeName, 
         "target": nodes[targetNodeId], 
         "source": nodes[sourceNodeId] 
        }); 
    

または

  • 使用指数(悪い考え、下の編集ノートを参照してください)

    var positionEdge = function(edge, nodes) { 
        edge.attr("x1", function(d) { return nodes[d.source].x; }) 
         .attr("y1", function(d) { return nodes[d.source].y; }) 
         .attr("x2", function(d) { return nodes[d.target].x; }) 
         .attr("y2", function(d) { return nodes[d.target].y; }); 
    }; 
    
  • 次の2つのソリューションを持っています

d3の標準は、最初のオプションを使用することですが、もしあなたがそれに行くなら、あなたのコードにもたらす他の編集があるかもしれません。 2番目のオプションでは、エッジエンドポイントが必要なたびに、ノード[d.source]とノード[d.target]を使用することに固執します。


編集:実際、forceレイアウトが自動的にオブジェクトベースのインデックスベースのエッジを変換します。したがって、2つの異なる配列をエッジに使用しない限り、最初のオプションに進む必要があります。

+0

ありがとうございます。私はあなたが私に与えた2番目のオプションのために行くことを選択したので、最初のものを使用すると正確に同じエラーが発生します(おそらく他の編集が必要なためです)。 ** 2番目のオプションでは、**のトピックを開いたというエラーは表示されなくなりました。したがって、私はあなたの答えを私の質問のアンサーとしてマークします。しかし、あなたがリニューアルした大胆な例を見て欲しいなら、本当に感謝しています。 属性の無効な値transform = "translate(NaN、NaN)"エラーが表示されます。 http://plnkr.co/edit/Bx0qe8DNEsnFgLhkxbfS?p=preview –

+0

@Sander_M:最初のオプションを使用するのは標準だけでなく、実際に 'd3.force'(editを参照)によって強制されたことを完全に忘れてしまいました。あなたを誤解して申し訳ありません。 – tarulen

+0

オプション2が有効ではないと聞いて悲しいです;)私はあなたの助言を受けて、ターゲットとソースとしてオブジェクトを使用します。おそらく私はもう一度始めなくてはならないということを意味します。私の学習曲線に非常に良い、私は本当にD3でデータ視覚化を愛しています。たとえそれがsigma.jsのような複雑さを感じるとしても、それは非常に多くの選択肢と可能性を提供します。クリアして編集してくれてありがとう! –

関連する問題