3d.js-力指向グラフのノードを更新

YMonnier

私は現在、グラフ(頂点+エッジ)を作成してアルゴリズムを適用するプログラムを開発しています。私はこのプログラムを作るために3d.jsを選びました。repaint頂点を追加すると関数に関する問題が発生します。

最初の頂点を追加すると機能しますが、次の場合、頂点は急速に増加します(vertex&label)...

スクリーンショット:


ここに画像の説明を入力してください
ここに画像の説明を入力してください

ソースコード:


var graph = (function() {
  return {
    modules: {},
    nodes: [],
    links: []
  }
})();

graph.modules.engin = (function() {
  var w, h, circleWidth, svgApp, force, link, node, nodes;
  var palette = {
    "white": "#FFFFFF",
    "gray": "#708284",
    "orange": "#BD3613",
    "red": "#D11C24",
    "blue": "#2176C7"
  };
  return {
    init: function() {
      var w = 960,
        h = 450;

      circleWidth = 7;

      svgApp = d3.select("body")
        .append("svg:svg")
        .attr("width", w)
        .attr("height", h)
        .attr("id", "svg")
        .attr("pointer-events", "all")
        .attr("viewBox", "0 0 " + w + " " + h)
        .attr("perserveAspectRatio", "xMinYMid")
        .append('svg:g');

      force = d3.layout.force()
        .nodes(graph.nodes)
        .links([])
        .gravity(0.1)
        .charge(-1000)
        .size([w, h]);


      //console.log(nodes);
      //nodes.push({})
      graph.modules.engin.repaint();

      graph.modules.engin.insertNode('V1');
      graph.modules.engin.insertNode('V2');
      graph.modules.engin.insertNode('V3');
    },
    repaint: function() {
      console.log('update');

      nodes = force.nodes();
      var links = force.links();

      link = svgApp.selectAll(".link")
        .data(links);
      link.enter().append("line")
        .attr("class", "link")
        .attr("stroke", palette.gray)
        .attr("fill", "none");
      link.exit().remove();


      node = svgApp.selectAll("circle.node")
        .data(nodes);
      node.enter().append("g")
        .attr("class", "node")
        .on("mouseover", function(d, i) { //MOUSEOVER
          if (!d.root) {
            d3.select(this).selectAll("circle")
              .transition()
              .duration(250)
              .style("cursor", "none")
              .attr("r", circleWidth + 3)
              .attr("fill", palette.orange);

            d3.select(this).select("text")
              .transition()
              .style("cursor", "none")
              .duration(250)
              .style("cursor", "none")
              .attr("font-size", "1.5em")
              .attr("x", 15)
              .attr("y", 5)
          } else {
            d3.select(this).selectAll("circle")
              .style("cursor", "none");

            d3.select(this).select("text")
              .style("cursor", "none");
          }
        })
        .on("mouseout", function(d, i) { //MOUSEOUT
          if (!d.root) {
            //CIRCLE
            d3.select(this).selectAll("circle")
              .transition()
              .duration(250)
              .attr("r", circleWidth)
              .attr("fill", palette.blue);

            //TEXT
            d3.select(this).select("text")
              .transition()
              .duration(250)
              .attr("font-size", "1em")
              .attr("x", 8)
              .attr("y", 4)
          }
        })
        .call(force.drag);

      node.append("svg:circle")
        .attr("cx", function(d) {
          return d.x;
        })
        .attr("cy", function(d) {
          return d.y;
        })
        .attr("r", circleWidth)
        .attr("fill", function(d, i) {
          if (!d.root) {
            return palette.blue;
          } else {
            return palette.red
          }
        });

      node.append("text")
        .text(function(d, i) {
          return d.name;
        })
        .attr("x", function(d, i) {
          return circleWidth + 5;
        })
        .attr("y", function(d, i) {
          if (!d.root) {
            return circleWidth
          } else {
            return circleWidth + 5
          }
        })
        .attr("font-family", "Bree Serif")
        .attr("fill", function(d, i) {
          return palette.white;
        })
        .attr("font-size", function(d, i) {
          return "1em";
        })
        .attr("text-anchor", function(d, i) {
          if (!d.root) {
            return "beginning";
          } else {
            return "end"
          }
        });
      node.exit().remove();

      force.on("tick", function(e) {
        node.attr("transform", function(d, i) {
          return "translate(" + d.x + "," + d.y + ")";
        });

        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;
          })
      });

      force.start();
    },
    insertNode: function(name) {
      nodes.push({
        name: name
      })
      graph.modules.engin.repaint();
    }
  }
})();
$(document).ready(function() {
  graph.modules.engin.init();
});
html {
  background-color: #042029;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

<button onclick="addNodes()">Restart Animation</button>

ありがとう、YM

YMonnier

私は自分の問題を解決しました:変数refの間違いとセレクター要素:

ソースコード:

var graph = (function() {
  return {
    modules: {},
    nodes: [],
    links: []
  }
})();

graph.modules.engin = (function() {
  var w, h, circleWidth, svgApp, force;
  var palette = {
    "white": "#FFFFFF",
    "gray": "#708284",
    "orange": "#BD3613",
    "red": "#D11C24",
    "blue": "#2176C7"
  };
  return {
    init: function() {
      h = $('body').height();
      w = $('body').width();

      circleWidth = 7;

      svgApp = d3.select("body")
        .append("svg:svg")
        .attr("pointer-events", "all")
        .attr("width", w)
        .attr("height", h)
        .attr("viewBox", "0 0 " + w + " " + h)
        .attr("perserveAspectRatio", "xMinYMid");

      force = d3.layout.force();

      graph.nodes = force.nodes();
      graph.links = force.links();

      graph.modules.engin.repaint();

      graph.modules.engin.insertNode('V1');
      graph.modules.engin.insertNode('V2');
      graph.modules.engin.insertNode('V3');
    },
    repaint: function() {
      console.log('update');

      var nodes = force.nodes();
      var links = force.links();

      console.log('BEFORE REPAINT');
      console.log(nodes);
      console.log(links);
      console.log(graph.nodes);
      console.log(graph.links);

      var link = svgApp.selectAll("line.link")
        .data(links);
      var linkEnter = link.enter().append("line")
        .attr("class", "link")
        .attr("stroke", palette.gray)
        .attr("fill", "none");
      link.exit().remove();


      var node = svgApp.selectAll("g.node")
        .data(nodes, function(d) {
          return d.name;
        });

      var nodeEnter = node.enter().append("g")
        .attr("class", "node")
        .on("mouseover", function(d, i) {
          if (!d.root) {
            d3.select(this).select("circle")
              .transition()
              .duration(250)
              .style("cursor", "none")
              .attr("r", circleWidth + 3)
              .attr("fill", palette.yellow);

            d3.select(this) //.select("text")
              .transition()
              .style("cursor", "none")
              .duration(250)
              .style("cursor", "none")
              .attr("font-size", "1.5em")
              .attr("x", 15)
              .attr("y", 5)
          } else {
            d3.select(this).select("circle")
              .style("cursor", "none");

            d3.select(this).select("text")
              .style("cursor", "none");

          }
        })
        .on("mouseout", function(d, i) {
          if (!d.root) {
            d3.select(this).select("circle")
              .transition()
              .duration(250)
              .attr("r", circleWidth)
              .attr("fill", palette.blue);

            d3.select(this) //.select("text")
              .transition()
              .duration(250)
              .attr("font-size", "1em")
              .attr("x", 8)
              .attr("y", 4)
          }
        })
        .call(force.drag);

      nodeEnter.append("svg:circle")
        .attr("cx", function(d) {
          return d.x;
        })
        .attr("cy", function(d) {
          return d.y;
        })
        .attr("r", circleWidth)
        .attr("fill", function(d, i) {
          if (!d.root) {
            return palette.blue;
          } else {
            return palette.red
          }
        }).attr("id", function(d) {
          return "Node-" + d.name;
        });

      nodeEnter.append("svg:text")
        .text(function(d, i) {
          return d.name;
        })
        .attr("x", function(d, i) {
          return circleWidth + 5;
        })
        .attr("y", function(d, i) {
          if (!d.root) {
            return circleWidth - 2
          } else {
            return circleWidth + 5
          }
        })
        .attr("font-family", "Bree Serif")
        .attr("fill", function(d, i) {
          return palette.white;
        })
        .attr("font-size", function(d, i) {
          return "1em";
        })
        .attr("text-anchor", function(d, i) {
          if (!d.root) {
            return "beginning";
          } else {
            return "end"
          }
        });

      node.exit().remove();

      force.on("tick", function(e) {
        node.attr("transform", function(d, i) {
          return "translate(" + d.x + "," + d.y + ")";
        });

        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;
          })
      });

      force.gravity(0.1)
        .charge(-1000)
        .size([w, h])
        .start();
    },
    insertNode: function(name) {
      graph.nodes.push({
        name: name
      })
      graph.modules.engin.repaint();
    }
  }
})();
$(document).ready(function() {
  graph.modules.engin.init();
});
html {
  background-color: #042029;
}

body {
  height: 600px;
  width: 100%;
}
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

<button onclick="addNodes()">Restart Animation</button>

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

検索後の力指向グラフでのd3.jsノードの位置

分類Dev

d3.jsにノードを動的に追加する力指向グラフ

分類Dev

d3、jsの力指向グラフにおけるノードの「ハード」フィルタリング

分類Dev

D3力指向グラフ:ノード位置の更新

分類Dev

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

分類Dev

d3.jsの力指向グラフ:ノードサイズをリンクの値に依存させる方法は?

分類Dev

d3jsを使用して、力有向グラフの特定のノードに子要素を追加する

分類Dev

D3力指向グラフの「ピン留め」ノード

分類Dev

ノードがドラッグされたときにd3jsの力指向グラフの揺れを少なくするにはどうすればよいですか?

分類Dev

d3.jsを使用した3D円グラフ

分類Dev

D3.jsフォークで作成された2Dグラフの左マウスボタンにマウスパンを追加します3D力指向グラフ

分類Dev

D3jsの力指向グラフでノードのハイライトと遷移効果を実装するにはどうすればよいですか?

分類Dev

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

分類Dev

D3.js:隣接行列からの力指向グラフ

分類Dev

追加のノードを作成するd3.jsグラフコード

分類Dev

D3.jsの力レイアウトグラフでメインノードに衛星ノードを作成する方法

分類Dev

d3.jsの強制グラフ-消えるノード

分類Dev

D3v4の力指向グラフ-localStorageはリンクとノードを切断します

分類Dev

D3ノードの色を動的に変更します(力指向グラフ)

分類Dev

D3.jsを使用した3D棒グラフのパースペクティブ問題

分類Dev

d3.jsを使用したドーナツグラフの更新

分類Dev

力指向グラフ(d3.js)の次数、次数、および次数を計算する方法は?

分類Dev

力指向グラフ(d3.js)の次数、次数、および次数を計算する方法は?

分類Dev

3つのjsオブジェクトの3D回転

分類Dev

d3.jsのツリーグラフのノード内にテキストを表示します

分類Dev

d3力指向ネットワークグラフのラベルでノードとリンクを更新しても、ノードが適切に削除されません

分類Dev

d3.jsのjsonからグラフデータ(ノード、リンク)を抽出できません

分類Dev

d3.jsを使用して、有効な有向グラフのノードを検索します

分類Dev

d3.jsのツリーパターンのノードをクリックして子ノードのグラフを描画します

Related 関連記事

  1. 1

    検索後の力指向グラフでのd3.jsノードの位置

  2. 2

    d3.jsにノードを動的に追加する力指向グラフ

  3. 3

    d3、jsの力指向グラフにおけるノードの「ハード」フィルタリング

  4. 4

    D3力指向グラフ:ノード位置の更新

  5. 5

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

  6. 6

    d3.jsの力指向グラフ:ノードサイズをリンクの値に依存させる方法は?

  7. 7

    d3jsを使用して、力有向グラフの特定のノードに子要素を追加する

  8. 8

    D3力指向グラフの「ピン留め」ノード

  9. 9

    ノードがドラッグされたときにd3jsの力指向グラフの揺れを少なくするにはどうすればよいですか?

  10. 10

    d3.jsを使用した3D円グラフ

  11. 11

    D3.jsフォークで作成された2Dグラフの左マウスボタンにマウスパンを追加します3D力指向グラフ

  12. 12

    D3jsの力指向グラフでノードのハイライトと遷移効果を実装するにはどうすればよいですか?

  13. 13

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

  14. 14

    D3.js:隣接行列からの力指向グラフ

  15. 15

    追加のノードを作成するd3.jsグラフコード

  16. 16

    D3.jsの力レイアウトグラフでメインノードに衛星ノードを作成する方法

  17. 17

    d3.jsの強制グラフ-消えるノード

  18. 18

    D3v4の力指向グラフ-localStorageはリンクとノードを切断します

  19. 19

    D3ノードの色を動的に変更します(力指向グラフ)

  20. 20

    D3.jsを使用した3D棒グラフのパースペクティブ問題

  21. 21

    d3.jsを使用したドーナツグラフの更新

  22. 22

    力指向グラフ(d3.js)の次数、次数、および次数を計算する方法は?

  23. 23

    力指向グラフ(d3.js)の次数、次数、および次数を計算する方法は?

  24. 24

    3つのjsオブジェクトの3D回転

  25. 25

    d3.jsのツリーグラフのノード内にテキストを表示します

  26. 26

    d3力指向ネットワークグラフのラベルでノードとリンクを更新しても、ノードが適切に削除されません

  27. 27

    d3.jsのjsonからグラフデータ(ノード、リンク)を抽出できません

  28. 28

    d3.jsを使用して、有効な有向グラフのノードを検索します

  29. 29

    d3.jsのツリーパターンのノードをクリックして子ノードのグラフを描画します

ホットタグ

アーカイブ