2

非常に多数のノードが存在する可能性のある強制レイアウトがあり、グラフが応答してレンダリングするには大きすぎます。システムのパフォーマンスを向上させる1つの方法は、ノードの数が多くなりすぎたときに、インディグリーとアウトディグリーに基づいてノードを削除することによってグラフを整理することだと考えていました。

リンクはノード配列のインデックスに関連しているため、ノードリストとリンクリストの再計算は少し面倒です。そのため、すべてのリンクを再構築する必要があります。

個々のノードを除外対象としてマークし(一部のノードと同様にfixed)、レイアウトアルゴリズムでそれらのノードをスキップできるようにする方が、よりエレガントなようです。これにより、グラフのサブセットを動的に選択して表示することができ、各ノードの状態(位置など)を可能な限り維持できます。

誰かがこのようなものを実装しましたか?

更新

フィルタの提案を実装しようとしましたが、興味深いエラーが発生しました。このfilterメソッドは、以下を実装していないオブジェクトを返すようenterです。

qChart apply limit:2
NODES BEF: [Array[218], enter: function, exit: function, select: function, selectAll: function, attr: function…]
NODES AFT: [Array[210], select: function, selectAll: function, attr: function, classed: function, style: function…]
Uncaught TypeError: Object [object Array] has no method 'enter' 

次のコードは、から取得するために実行されBEFますAFT

nodeSubset = nodeSubset.filter(function(n) { return (n.sentCount() <= limit); });   

更新2

問題を切り分けるためにjsfiddleを作成しました。この例は、ChrisJamesCの答えの私の解釈を実装しています。私が彼の提案を直接実装しようとしたとき(のfilter後にを置く)、によって返されたオブジェクトが定義されていなかったためdata、後続の呼び出しは失敗しました。enterfilterenter

目標は、を持っているノードのみをレイアウトで選択することですactive == true。したがって、この例では、これはノードbを除外する必要があることを意味します。

4

1 に答える 1

2

このオプションは、属性selection.filter()と組み合わせて使用​​できます。node.weight

あなたが通常することは次のとおりです。

var node = svg.selectAll(".node")
    .data(graph.nodes)
    .enter().append("circle")

ここでできること:

var node = svg.selectAll(".node")
    .data(graph.nodes)
    .filter(function(d){return d.weight>3})
    .enter();

同じ方法を使用して、これらのノードに向かうリンクを描画から削除する必要がある場合もあります。

編集データ配列でノードを直接アクティブとしてマークする場合は、提供するデータをフィルタリングする必要があります(リンクについても同じことを行います)

var node = svg.selectAll(".node")
    .data(force.nodes().filter(function(d) { return d.active; }));

var link = svg.selectAll(".link")
      .data(force.links().filter(function(d) { 
          var show =  d.source.active && d.target.active;
          if (show)
              console.log("kept", d);
          else
              console.log("excluded", d);
          return show;
      }) );

フィドル

各ノードの重みを計算してこれを実行する場合でも、ノードとリンクをグラフに渡す前にこれを実行し、ノードをアクティブまたは特定の基準に従わないものとしてマークしてから、アクティブに従ってリンクをフィルタリングすることをお勧めしますノード。それ以外の場合は、重みを取得するためにのみ力指向レイアウト全体をロードしてから、データをフィルタリングして力指向グラフを再ロードする必要があります。

于 2013-03-12T19:49:41.517 に答える