D3v4力図を新しいデータでスムーズに更新する方法

xdl

まったく新しいデータ(データストリームなど)からの力指向有向グラフに新しいノードを導入する方法を探しています。

mbostockの例(thisまたはthis)では、初期設定ではすべてのノードがレンダリングされるため、ノードはスムーズに出入りできます。

ただし、まったく新しいデータポイントが導入された場合、グラフは最初からレンダリングされます。まったく新しいノードをグラフにスムーズに移行させる方法はありますか?

私が何を意味するかについては、このコーデックス(2番目の例を直接適応したもの)を参照してください既存のノードに出入りすることは問題ありませんが、新しいノードが入るときの移行は途方もないです。

  //smooth update
  nodes = [a, b];
  links = [l_ab];
  restart();

  //not as smooth
  var d = {id: id++};
  nodes = [a, b, c, d];
    links = [l_ab, l_bc, l_ca, {
      source: a,
      target: d
    }];
  restart();
ジェラルド・フルタド

真新しいノードの入り口は、単純な理由で「ジャンピー」に見えます。シミュレーションが開始されると、そのノードは最初に左上隅(0,0SVG座標系)に表示されます。

「スムーズ」の定義に応じて、ここにはさまざまな解決策があります私はそれを作るための最も明白な方法数えるsmoothierはSVGの中央にノードの初期位置を設定しています。そうすれば、新しいノードは最終的な位置までそれほど移動しません。

新しいノードのxyプロパティを設定してそれを行うことができます:

var d = {id: id++, x: width/2, y: height/2};

その変更を加えたコードは次のとおりです。

var svg = d3.select("svg"),
  width = 250
height = 250
color = d3.scaleOrdinal(d3.schemeCategory10);

var a = {
    id: "a"
  },
  b = {
    id: "b"
  },
  c = {
    id: "c"
  },
  nodes = [a, b, c],
  l_ab = {
    source: a,
    target: b
  }
l_bc = {
    source: b,
    target: c
  },
  l_ca = {
    source: c,
    target: a
  }
links = [l_ab, l_bc, l_ca];

var id = 0;

var simulation = d3.forceSimulation(nodes)
  .force('charge', d3.forceManyBody())
  .force('link', d3.forceLink())
  .force('center', d3.forceCenter(width / 2, height / 2))
  .alphaTarget(1)
  .on("tick", ticked)
  .stop()

var g = svg.append("g")
link = g.append("g").attr("stroke", "#000").attr("stroke-width", 1.5).selectAll(".link"),
  node = g.append("g").attr("stroke", "#fff").attr("stroke-width", 1.5).selectAll(".node");

restart();

function restart() {

  // Apply the general update pattern to the nodes.
  node = node.data(nodes, function(d) {
    return d.id;
  });

  node.exit().transition()
    .attr("r", 0)
    .remove();

  node = node.enter().append("circle")
    .attr("fill", function(d) {
      return color(d.id);
    })
    .call(function(node) {
      node.transition().attr("r", 8);
    })
    .merge(node);

  // Apply the general update pattern to the links.
  link = link.data(links, function(d) {
    return d.source.id + "-" + d.target.id;
  });

  // Keep the exiting links connected to the moving remaining nodes.
  link.exit().transition()
    .attr("stroke-opacity", 0)
    .attrTween("x1", function(d) {
      return function() {
        return d.source.x;
      };
    })
    .attrTween("x2", function(d) {
      return function() {
        return d.target.x;
      };
    })
    .attrTween("y1", function(d) {
      return function() {
        return d.source.y;
      };
    })
    .attrTween("y2", function(d) {
      return function() {
        return d.target.y;
      };
    })
    .remove();

  link = link.enter().append("line")
    .call(function(link) {
      link.transition().attr("stroke-opacity", 1);
    })
    .merge(link);

  // Update and restart the simulation.
  simulation.nodes(nodes);
  simulation.force("link").links(links);
  simulation.alpha(1).restart();
}

function ticked() {
  node.attr("cx", function(d) {
      return d.x;
    })
    .attr("cy", function(d) {
      return 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;
    });
}

restart();

document.getElementById('btnRenderExisting3Node').addEventListener('click', function() {
  nodes = [a, b, c];
  links = [l_ab, l_bc, l_ca];
  restart();
});

document.getElementById('btnRenderExisting2Node').addEventListener('click', function() {
  nodes = [a, b];
  links = [l_ab];
  restart();
});

document.getElementById('btnRenderNewNode').addEventListener('click', function() {
  var d = {
    id: id++,
    x: width / 2,
    y: height / 2
  };
  nodes = [a, b, c, d];
  links = [l_ab, l_bc, l_ca, {
    source: a,
    target: d
  }];
  restart();
});
svg {
  border: 1px black solid
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<div>
  <button id='btnRenderExisting2Node'>Render 2 existing nodes</button>
  <button id='btnRenderExisting3Node'>Render 3 existing nodes</button>
  <button id='btnRenderNewNode'>Render 3 existing nodes and 1 brand new node</button>
</div>
<svg width="250" height="250"></svg>
</div>

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

D3v4データを範囲にスケーリングする

分類Dev

d3v4で初期ズームが機能しない

分類Dev

ネストされたデータのd3v4の新しい一般的な更新パターンを理解していない

分類Dev

D3v4は中央にズームするだけです

分類Dev

d3v4のズーム可能な散布図にツールチップを追加できません

分類Dev

マウスを介したD3V4ズームとプログラマティックは互いに独立してズームしています

分類Dev

ズーム機能を備えたタイムラインのd3v4にフィルターまたはScaleExtentを追加する方法

分類Dev

このデータからxscaleとxaxisを作成する方法D3V4

分類Dev

Canvasを使用してd3v4 / v5でスクロールをパンする方法

分類Dev

d3v4棒グラフにデータラベルを追加する方法

分類Dev

ネストされたデータでのD3v4の更新、最良の方法

分類Dev

マウスホイール/タッチスクリーンでd3v4ズームイベントが発生しない

分類Dev

マージを伴う一般更新パターンを使用して要素を入力する際のD3V4遷移

分類Dev

新しいデータの地図を常に更新する

分類Dev

d3v4力シミュレーションで重力強度を設定する方法

分類Dev

d3チャートを新しいデータで更新する

分類Dev

複数の条件でデータフレームの新しい列に値を入力する方法

分類Dev

d3散布図を更新すると、新しいデータポイントが正しい位置にありません

分類Dev

ネストされたデータモデルのD3v4更新パターン

分類Dev

SVMモデルを新しいデータで更新する方法

分類Dev

d3v4棒グラフのツールチップのデータを取得する

分類Dev

SQLデータベースに新しいデータを追加した後に$ scopeを更新する方法

分類Dev

データベースを更新してから、Androidのsimplecursoradapterに新しいデータを配置する方法は?

分類Dev

データベースを更新してから、Androidのsimplecursoradapterに新しいデータを配置する方法は?

分類Dev

d3v5でパスを更新する際のスムーズな移行

分類Dev

neo4jで新しいデータベースを作成する方法

分類Dev

3〜4列のデータごとに新しいdiv行を生成する方法

分類Dev

D3v4はアレイに別のノードを追加します

分類Dev

D3V4折れ線グラフをビューに移行する

Related 関連記事

  1. 1

    D3v4データを範囲にスケーリングする

  2. 2

    d3v4で初期ズームが機能しない

  3. 3

    ネストされたデータのd3v4の新しい一般的な更新パターンを理解していない

  4. 4

    D3v4は中央にズームするだけです

  5. 5

    d3v4のズーム可能な散布図にツールチップを追加できません

  6. 6

    マウスを介したD3V4ズームとプログラマティックは互いに独立してズームしています

  7. 7

    ズーム機能を備えたタイムラインのd3v4にフィルターまたはScaleExtentを追加する方法

  8. 8

    このデータからxscaleとxaxisを作成する方法D3V4

  9. 9

    Canvasを使用してd3v4 / v5でスクロールをパンする方法

  10. 10

    d3v4棒グラフにデータラベルを追加する方法

  11. 11

    ネストされたデータでのD3v4の更新、最良の方法

  12. 12

    マウスホイール/タッチスクリーンでd3v4ズームイベントが発生しない

  13. 13

    マージを伴う一般更新パターンを使用して要素を入力する際のD3V4遷移

  14. 14

    新しいデータの地図を常に更新する

  15. 15

    d3v4力シミュレーションで重力強度を設定する方法

  16. 16

    d3チャートを新しいデータで更新する

  17. 17

    複数の条件でデータフレームの新しい列に値を入力する方法

  18. 18

    d3散布図を更新すると、新しいデータポイントが正しい位置にありません

  19. 19

    ネストされたデータモデルのD3v4更新パターン

  20. 20

    SVMモデルを新しいデータで更新する方法

  21. 21

    d3v4棒グラフのツールチップのデータを取得する

  22. 22

    SQLデータベースに新しいデータを追加した後に$ scopeを更新する方法

  23. 23

    データベースを更新してから、Androidのsimplecursoradapterに新しいデータを配置する方法は?

  24. 24

    データベースを更新してから、Androidのsimplecursoradapterに新しいデータを配置する方法は?

  25. 25

    d3v5でパスを更新する際のスムーズな移行

  26. 26

    neo4jで新しいデータベースを作成する方法

  27. 27

    3〜4列のデータごとに新しいdiv行を生成する方法

  28. 28

    D3v4はアレイに別のノードを追加します

  29. 29

    D3V4折れ線グラフをビューに移行する

ホットタグ

アーカイブ