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

デレク・スミス

目的:検索後、ノードを表示領域の中央に配置します

ユーザーが名前でノードを検索できるようにする力有向グラフを作成しました。ノードが検索されると、選択されたノードは表示されたままになりますが、他のすべてのノードは一時的に不透明度を下げて、検索されたノードを強調表示します。ここで、検索したノードを表示領域の中央に配置したいと思います。私は多くの方法を試みましたが、ノードラベルを含むグラフ全体の翻訳に失敗しました。どんな助けでも大歓迎です。

jsfiddle(注:オートコンプリート検索はスクリプトから実行すると完全に機能しますが、jsfiddleでは失敗するようです):https://jsfiddle.net/dereksmith5822/73j63nn0/

<script>

var width = 900,
    height = 590;

var svg = d3.select("body")
        .append("svg")
        .attr("width", width)
        .attr("height", height)
        .call(d3.behavior.zoom().scaleExtent([0.1,5]).on("zoom", redraw)).on("dblclick.zoom", null)
        .append('g');

//INPUT DATA
var links = [
    {source: 'N1', target: 'N2'},
    {source: 'N1', target: 'N3'},
    {source: 'N2', target: 'N3'},
    {source: 'N3', target: 'N4'},
];

var nodes = [ 
    {id: 'N1', name: 'A'},
    {id: 'N2', name: 'B'},
    {id: 'N3', name: 'C'},
    {id: 'N4', name: 'D'},
];

//CONNECTIONS
var hash_lookup = [];
nodes.forEach(function(d, i) {
  hash_lookup[d.id] = d;
});
links.forEach(function(d, i) {
  d.source = hash_lookup[d.source];
  d.target = hash_lookup[d.target];
});

//FORCE LAYOUT
var force = d3.layout.force()
    .size([width, height])
    .nodes(d3.values(nodes))
    .links(links)
    .on('tick', tick)
    .linkDistance(100)
    .gravity(.15)
    .friction(.8)
    .linkStrength(1)
    .charge(-425)
    .chargeDistance(600)
    .start();

//LINKS
var link = svg.selectAll('.link')
    .data(links)
    .enter().append('line')
    .attr('class', 'link');

//NODES
var node = svg.selectAll('.node')
    .data(force.nodes())
    .enter().append('circle')
    .attr('class', 'node')
    .attr('r', width * 0.01)

//LABELS
var text_center = false;
var nominal_text_size = 12;
var max_text_size = 22;
var nominal_base_node_size = 8;
var max_base_node_size = 36;    
var size = d3.scale.pow().exponent(1)
  .domain([1,100])
  .range([8,24]);

var text = svg.selectAll(".text")
    .data(nodes)
    .enter().append("text")
    .attr("dy", ".35em")
    .style("font-size", nominal_text_size + "px")

    if (text_center)
     text.text(function(d) { return d.name; })
    .style("text-anchor", "middle");

    else 
    text.attr("dx", function(d) {return (size(d.size)|| nominal_base_node_size);})
    .text(function(d) { return '\u2002'+d.name; });

//ZOOM AND PAN
function redraw() {
    svg.attr("transform",
        "translate(" + d3.event.translate + ")"
        + " scale(" + d3.event.scale + ")");
    }

var drag = force.drag()
      .on("dragstart", function(d) {
        d3.event.sourceEvent.stopPropagation();
      });

//NODES IN SPACE
function tick(e) {

    text.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

    node.attr('cx', function(d) { return d.x; })
        .attr('cy', function(d) { return d.y; })
        .call(force.drag);

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

};

//AUTOCOMPLETE SEARCH
var optArray = [];
for (var i = 0; i < nodes.length - 1; i++) {
    optArray.push(nodes[i].name);
}
optArray = optArray.sort();

$(function () {
    $("#search").autocomplete({
        source: optArray
    });
});

function searchNode() {
    var selectedVal = document.getElementById('search').value;
    if (selectedVal == 'none') {}
    else {
        var selected = node.filter(function (d, i) {
            return d.name != selectedVal;
        });
         var selectedText = text.filter(function (d, i) {
            return d.name != selectedVal;
        });
        selected.style("opacity", "0");
        selectedText.style("opacity", "0");
        var link = svg.selectAll(".link")
            link.style("opacity", "0");
        d3.selectAll(".node, .link, .text").transition()
            .duration(3000)
            .style("opacity", '1');
    }
}
    </script>
just.ru

これがあなたがそれをどのように行うことができるかという考えです:

あなたのzoom行動を保存します

var zoom = d3.behavior.zoom().scaleExtent([0.1,5]).on("zoom", redraw);
var svg = d3.select("body")
    .append("svg")
    .attr("width", width)
    .attr("height", height)
    .call(zoom).on("dblclick.zoom", null)
    .append('g');

ではsearchNode機能:

var selectedNode = node
    .filter(function (d, i) { return d.name == selectedVal; })
    .datum();
var desiredPosition = { x: 100, y: 100 }; // constants, set to svg center point
zoom.translate([desiredPosition.x - selectedNode.x, desiredPosition.y - selectedNode.y]);
zoom.event(svg);

このコードはズームのスケールを尊重しません。zoom.scale()selectedNode座標を取得して乗算するだけでよいと思います

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

D3グラフのノードの検索機能

分類Dev

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

分類Dev

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

分類Dev

d3の力指向グラフの例を変更する

分類Dev

d3力指向グラフノードは、フィルター後も固定位置に留まります

分類Dev

D3力指向グラフ:ドラッグ中にノードがマウスの位置に留まらない

分類Dev

d3力指向レイアウトで任意のノードを検索/再センタリングします

分類Dev

d3の力レイアウトグラフで同じノード位置を取得する方法

分類Dev

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

分類Dev

d3力指向グラフレイアウトでノードのグループを視覚化する方法

分類Dev

d3の力指向グラフでノードとして使用される場合、divのサイズを動的に変更します

分類Dev

d3の力指向グラフに新しいノードのみを追加するにはどうすればよいですか?

分類Dev

変換後のD3ノードの画面位置の取得

分類Dev

D3の力指向グラフ内に画像をレンダリングできません

分類Dev

D3の力指向グラフで複数のベジェ接続エッジを描画する

分類Dev

D3の力指向グラフで使用するJSONファイルを選択する方法

分類Dev

D3力指向グラフ:複雑なグラフのパフォーマンスの問題

分類Dev

d3力指向グラフのノードをシングルクリックとダブルクリックの両方

分類Dev

スタイリングノードラベルがd3力指向グラフで機能しない

分類Dev

D3の力指向グラフ(v4)はノードとしてimgを受け入れていません

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

Pythonのgraphvizでのグラフノードの位置

分類Dev

d3をv4に更新した後のノード位置の問題

分類Dev

D3のノードIDを検索します

分類Dev

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

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

    D3グラフのノードの検索機能

  4. 4

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

  5. 5

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

  6. 6

    d3の力指向グラフの例を変更する

  7. 7

    d3力指向グラフノードは、フィルター後も固定位置に留まります

  8. 8

    D3力指向グラフ:ドラッグ中にノードがマウスの位置に留まらない

  9. 9

    d3力指向レイアウトで任意のノードを検索/再センタリングします

  10. 10

    d3の力レイアウトグラフで同じノード位置を取得する方法

  11. 11

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

  12. 12

    d3力指向グラフレイアウトでノードのグループを視覚化する方法

  13. 13

    d3の力指向グラフでノードとして使用される場合、divのサイズを動的に変更します

  14. 14

    d3の力指向グラフに新しいノードのみを追加するにはどうすればよいですか?

  15. 15

    変換後のD3ノードの画面位置の取得

  16. 16

    D3の力指向グラフ内に画像をレンダリングできません

  17. 17

    D3の力指向グラフで複数のベジェ接続エッジを描画する

  18. 18

    D3の力指向グラフで使用するJSONファイルを選択する方法

  19. 19

    D3力指向グラフ:複雑なグラフのパフォーマンスの問題

  20. 20

    d3力指向グラフのノードをシングルクリックとダブルクリックの両方

  21. 21

    スタイリングノードラベルがd3力指向グラフで機能しない

  22. 22

    D3の力指向グラフ(v4)はノードとしてimgを受け入れていません

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

    Pythonのgraphvizでのグラフノードの位置

  27. 27

    d3をv4に更新した後のノード位置の問題

  28. 28

    D3のノードIDを検索します

  29. 29

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

ホットタグ

アーカイブ