D3jsはenter()で重複ノードを強制します

マーシン

d3jsに問題があり、何が起こっているのか理解できません。アイデアは、いくつかのエンドポイントデータ(最初のimg)から初期グラフを描画することです。これは問題なく機能します。各ノードはクリック可能です。クリックすると、そのノードに対してajax呼び出しが行われ、その時点でのいくつかの基準に基づいてデータが返されます。nodes.push(xx)、links.push(xx)がたまたま新しいノードを追加し、restart()が呼び出されます。新しいノードとリンクを描画します。問題は、メイングラフが正しいことをしていることです(最初のグラフに偽のデータを配置する必要があったため、スクリーンショットには表示されません。つまり、エンドポイント/ record / id / firstを呼び出してもデータは返されません)が、ランダムノードが右下隅に表示されます。

以下の例でも、1番目、2番目、3番目をクリックしてもデータが変更されない場合でも、同じデータが渡された状態でrestart()後にnode.enter()に問題が発生することがわかります。

JS FIDDLE:http//jsfiddle.net/5754j86e/

初期グラフ

クリック後

var   w = 1200,
      h = 1200;

var nodes = [];
var links = [];
var node;
var link;
var texts;

var ids = [];

var circleWidth = 10;

var initialIdentifier = "marcin";

nodes = initialBuildNodes(initialIdentifier, sparql);

links = initialBuildLinks(sparql);

//Add SVG

var svg = d3.select('#chart').append('svg')
  .attr('width', w)
  .attr('height', h);

var linkGroup = svg.append("svg:g").attr("id", "link-group");
var nodeGroup = svg.append("svg:g").attr("id", "node-group");
var textGroup = svg.append("svg:g").attr("id", "text-group");

//Add Force Layout

var force = d3.layout.force()
  .size([w, h])
  .gravity(.05)
  .charge(-1040);

force.linkDistance(120);

restart();


function restart() {

    force.links(links)

    console.log("LINKS ARE: ", links)

    link = linkGroup.selectAll(".link").data (links);

    link.enter().append('line')
        .attr("class", "link");

    link.exit().remove();

    force.nodes(nodes)

    console.log("NODES ARE: ", nodes)

    node = nodeGroup.selectAll(".node").data (nodes);

    node.enter().append("svg:g")
            .attr("class", "node")
            .call(force.drag);

    node.append('circle')
        .attr('cx', function(d) { return d.x; })
        .attr('cy', function(d) { return d.y; })
        .attr('r', circleWidth )
        .attr('fill', function(d, i) {
            if (i>0) { return palette.pink }
            else { return palette.blue }
        })

        .on("click", function(d) {
            nodeClicked (d);
        })

        .on('mouseenter', function(d){
            nodeMouseEnter(d)
            })
        .on('mouseout', function(d){
            nodeMouseOut(d)
        });


    node.exit().remove();

    var annotation = textGroup.selectAll(".annotation").data (nodes);

    annotation.enter().append("svg:g")
            .attr("class", "annotation")
            .append("text")
            .attr("x", function(d) { return d.radius + 4 })
            .attr("y", ".31em")
            .attr("class", "label")
            .text(function(d) { return d.name; });
    annotation.exit().remove();


    force.start();
}


function nodeClicked (d) {

    // AJAX CALL happens here and bunch of nodes.push({name: "new name"}) happen

}


force.on('tick', function(e) {
        link
            .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 })

        node.attr('transform', function(d, i) {
            return 'translate('+ d.x +', '+ d.y +')';
        })

        svg.selectAll(".annotation").attr("transform", function(d) {
            var labelx = d.x + 13;
            return "translate(" + labelx + "," + d.y + ")";
        })



    });
マーシン

ドキュメント(https://github.com/mbostock/d3/wiki/Selections#enter)に基づいて、わかりました

var update_sel = svg.selectAll("circle").data(data)
update_sel.attr(/* operate on old elements only */)
update_sel.enter().append("circle").attr(/* operate on new elements only */)
update_sel.attr(/* operate on old and new elements */)
update_sel.exit().remove() /* complete the enter-update-exit pattern */

私のコードから、enter()を実行し、別のステートメントでノードに円を追加していることがわかります。

node = nodeGroup.selectAll(".node").data (nodes);

    node.enter().append("svg:g")
            .attr("class", "node")
            .call(force.drag);

    node.append('circle')
        .attr('cx', function(d) { return d.x; })
        .attr('cy', function(d) { return d.y; })
        .attr('r', circleWidth )
        .attr('fill', function(d, i) {
            if (i>0) { return palette.pink }
            else { return palette.blue }
        });

円の追加はenter()の範囲内である必要があります。そうでない場合、新しいノードだけでなくすべてのノードで発生するため、次のようになります。

    node.enter().append("svg:g")
      .attr("class", "node")
      .call(force.drag)

      .append('circle')
        .attr('cx', function(d) { return d.x; })
        .attr('cy', function(d) { return d.y; })
        .attr('r', circleWidth )
        .attr('fill', function(d, i) {
            if (i>0) { return palette.pink }
            else { return palette.blue }
        });

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

d3jsは多数のノードを強制します

分類Dev

d3jsはノードxyの開始位置を強制します

分類Dev

D3jsはレイアウト更新ノードとリンクを強制します

分類Dev

d3jsの強制レイアウトで特定のノードのスタイルを更新する

分類Dev

d3jsは地図上にレイアウトを強制します

分類Dev

D3JS Force Layoutの新しいノードは、既存のノードを切断します

分類Dev

D3jsですでに作成されているノードを反復処理します

分類Dev

d3js強制指示-ノードにカーソルを合わせると、リンクされたノードとリンクが強調表示/カラーアップされますか?

分類Dev

D3JSは日付を複製します

分類Dev

Hobbeltの「グループ/バンドルノード」D3強制レイアウトの例でノードにラベルを追加しますか?

分類Dev

重複しない円充填d3jsチャートを取得するにはどうすればよいですか?

分類Dev

d3jsノードの位置を決定論的にする方法は?

分類Dev

d3js v4:力指向グラフにノードを追加します

分類Dev

marklogicは重複するノード/要素を削除します

分類Dev

でノードにラベルを付けると、D3JSでズームグリッチが発生します

分類Dev

Angular JsはノードJに強制されますか?

分類Dev

xsltは、子ノードと親ノードの重複を削除します

分類Dev

neo4j-MERGEは重複ノードを作成します

分類Dev

d3.js強制ノードキャンバスレイアウトでノードグループの色を変更する

分類Dev

強制適用後のARKitはノードの位置を取得します

分類Dev

d3jsのユーザー入力を使用して、ドロップダウンで複数のグラフを作成します

分類Dev

Windowsで実行中のノードプロセスを強制終了します

分類Dev

graphvizでノードの左から右の順序を強制しますか?

分類Dev

GRAPHVIZ:ノードをページの上部に強制します

分類Dev

d3jsで重複するアークラベルを修正するにはどうすればよいですか?

分類Dev

d3JSの力指向グラフで強調表示されているすべてのノードの色を変更するにはどうすればよいですか?

分類Dev

d3強制レイアウト:d3が正しく機能するには、ノードで何らかの順序が必要ですか?

分類Dev

d3 jsでルートから選択したノードへのパスを強調表示するにはどうすればよいですか?

分類Dev

D3jsはパス `d`属性をデータにバインドします

Related 関連記事

  1. 1

    d3jsは多数のノードを強制します

  2. 2

    d3jsはノードxyの開始位置を強制します

  3. 3

    D3jsはレイアウト更新ノードとリンクを強制します

  4. 4

    d3jsの強制レイアウトで特定のノードのスタイルを更新する

  5. 5

    d3jsは地図上にレイアウトを強制します

  6. 6

    D3JS Force Layoutの新しいノードは、既存のノードを切断します

  7. 7

    D3jsですでに作成されているノードを反復処理します

  8. 8

    d3js強制指示-ノードにカーソルを合わせると、リンクされたノードとリンクが強調表示/カラーアップされますか?

  9. 9

    D3JSは日付を複製します

  10. 10

    Hobbeltの「グループ/バンドルノード」D3強制レイアウトの例でノードにラベルを追加しますか?

  11. 11

    重複しない円充填d3jsチャートを取得するにはどうすればよいですか?

  12. 12

    d3jsノードの位置を決定論的にする方法は?

  13. 13

    d3js v4:力指向グラフにノードを追加します

  14. 14

    marklogicは重複するノード/要素を削除します

  15. 15

    でノードにラベルを付けると、D3JSでズームグリッチが発生します

  16. 16

    Angular JsはノードJに強制されますか?

  17. 17

    xsltは、子ノードと親ノードの重複を削除します

  18. 18

    neo4j-MERGEは重複ノードを作成します

  19. 19

    d3.js強制ノードキャンバスレイアウトでノードグループの色を変更する

  20. 20

    強制適用後のARKitはノードの位置を取得します

  21. 21

    d3jsのユーザー入力を使用して、ドロップダウンで複数のグラフを作成します

  22. 22

    Windowsで実行中のノードプロセスを強制終了します

  23. 23

    graphvizでノードの左から右の順序を強制しますか?

  24. 24

    GRAPHVIZ:ノードをページの上部に強制します

  25. 25

    d3jsで重複するアークラベルを修正するにはどうすればよいですか?

  26. 26

    d3JSの力指向グラフで強調表示されているすべてのノードの色を変更するにはどうすればよいですか?

  27. 27

    d3強制レイアウト:d3が正しく機能するには、ノードで何らかの順序が必要ですか?

  28. 28

    d3 jsでルートから選択したノードへのパスを強調表示するにはどうすればよいですか?

  29. 29

    D3jsはパス `d`属性をデータにバインドします

ホットタグ

アーカイブ