D3jsは力指向レイアウトに円を追加します

モーガン

私は明らかにjavascriptに、そして確かにD3jsに不慣れです...

「ポイント」をノード/パスに追加された「サークル」に変換する方法を理解するのに途方に暮れていますか?

私はそれがtick()関数と関係があると推測していますが、私は啓発的なドキュメントを見つけることができません:(

var node = svg.selectAll("path.node")
.data(dataset.nodes)
.enter().append("path").attr("class", "node")
.style("cursor","pointer")
.style("fill", function(d) {
        if (d.color) {return d.color;}
        else  { return "#fff" }
    ;})
.call(force.drag);

// add the nodes
node.append("circle")
    .attr("r", 35);

function tick() {
  node.attr("d", function(d) { var p = path({"type":"Feature","geometry":{"type":"Point","coordinates":[d.x, d.y]}}); return p ? p : 'M 0 0' });
  link.attr("d", function(d) { var p = path({"type":"Feature","geometry":{"type":"LineString","coordinates":[[d.source.x, d.source.y],[d.target.x, d.target.y]]}}); return p ? p : 'M 0 0' });
}

ここでcodepenを作成しましたhttps://codepen.io/unit60/pen/KqLEPe

正しい方向に操縦していただければ幸いです...ヘルプ:)

マーク

私はあなたが何を求めているのか理解していると思います。現在のコードスニペットでは、要素の下にcircleをネストしてtextpathます。の有効な子ではないため、これは機能しませんpath代わりに、それらをg(グループ)に配置します。

var node = svg.selectAll(".node")
    .data(dataset.nodes)
    .enter()
    .append("g")
    .attr("class", "node")
    .style("cursor","pointer")
    .call(force.drag);

// add the nodes
node.append("circle")
    .attr("r", 35)
    .style("fill", function(d) {
      if (d.color) {return d.color;}
      else  { return "#fff"; }
   });


// add the text 
node.append("text")
    .attr("x", 12)
    .attr("dy", ".35em")
    .text(function(d) { return d.name; });

次に、tick関数を更新して、グループを適切に配置する必要があります(これまでのようにパスを描画するのではありません)。

function tick() {
  node.attr("transform", function(d) {   
    // change this to centroid 
    var p = path.centroid({"type":"Feature","geometry":{"type":"Point","coordinates":[d.x, d.y]}});    
    return "translate(" + p + ")";
  });  

  link.attr("d", function(d) { 
    var p = path({"type":"Feature","geometry":{"type":"LineString","coordinates":[[d.source.x, d.source.y],[d.target.x, d.target.y]]}}); return p ? p : 'M 0 0' });
  }
}

更新されたcodepen ; 実行例:

var dataset = {
    nodes: [{
        name: "Location 01",
        class: "overlay01-link",
        color: "red"
    }, {
        name: "Location 02",
        class: "overlay02-link",
        color: "orange"
    }, {
        name: "Location 03"
    }, {
        name: "Location 04"
    }, {
        name: "Location 05"
    }, {
        name: "Location 06"
    }, {
        name: "Location 07"
    }, {
        name: "Location 08"
    }, {
        name: "Location 09"
    }, {
        name: "Location 10"
    }],
    edges: [{
        source: 0,
        target: 1
    }, {
        source: 0,
        target: 2
    }, {
        source: 0,
        target: 3
    }, {
        source: 0,
        target: 4
    }, {
        source: 1,
        target: 5
    }, {
        source: 2,
        target: 5
    }, {
        source: 2,
        target: 5
    }, {
        source: 3,
        target: 4
    }, {
        source: 5,
        target: 8
    }, {
        source: 5,
        target: 9
    }, {
        source: 6,
        target: 7
    }, {
        source: 7,
        target: 8
    }, {
        source: 8,
        target: 9
    }]
};

var projections = {
  "Albers": d3.geo.albers(),
  "Azimuthal Equal Area": d3.geo.azimuthalEqualArea(),
  "Azimuthal Eqidistant": d3.geo.azimuthalEquidistant(),
  "Conic Conformal": d3.geo.conicConformal(),
  "Conic Equal Area": d3.geo.conicEqualArea(),
  "Conic Equidistant": d3.geo.conicEquidistant(),
  "Eqirectangular": d3.geo.equirectangular(),
  "Gnomonic": d3.geo.gnomonic(),
  "Mercator": d3.geo.mercator(),
  "Orthographic": d3.geo.orthographic(),
  "Stereographic": d3.geo.stereographic(),
  "Transverse Mercator": d3.geo.transverseMercator(),
};
var config = { "projection": "Orthographic", "clip": false, "friction": .45, "linkStrength": 1, "linkDistance": 320, "charge": 3, "gravity": .1, "theta": .1 };
var gui = new dat.GUI();
//var projectionChanger = gui.add(config, "projection", ['equalarea', 'equidistant', 'gnomonic', 'orthographic', 'stereographic', 'rectangular']);
var projectionChanger = gui.add(config, "projection", Object.keys(projections));
//http://stackoverflow.com/a/3417242
function wrapIndex(i, i_max) {
     return ((i % i_max) + i_max) % i_max;
}
projectionChanger.onChange(function(value) {
  projection = projections[value]
  .scale(height/2)
  .translate([(width/2)-125, height/2])
  .clipAngle(config["clip"] ? 90 : null)

  path.projection(projections[value])
  return
  if(value == 'rectangular') {
    path = d3.geo.path().projection(function(coordinates){
     console.log(coordinates[0], coordinates[1])
     return [
           wrapIndex(coordinates[0], width),
           wrapIndex(coordinates[1], height),
           ];
    });
    config['clip'] = false
  } else {
    projection.mode(value)
    path = d3.geo.path().projection(projection)
  }

  force.start()
});

var clipChanger = gui.add(config, "clip").listen();
clipChanger.onChange(function(value) {
  projection.clipAngle(value ? 90 : null)
  force.start()
});

var fl = gui.addFolder('Force Layout');
fl.open()

var frictionChanger = fl.add(config, "friction", 0, 1);
frictionChanger.onChange(function(value) {
  force.friction(value)
  force.start()
});

var linkDistanceChanger = fl.add(config, "linkDistance", 0, 400);
linkDistanceChanger.onChange(function(value) {
  force.linkDistance(value)
  force.start()
});

var linkStrengthChanger = fl.add(config, "linkStrength", 0, 1);
linkStrengthChanger.onChange(function(value) {
  force.linkStrength(value)
  force.start()
});

var chargeChanger = fl.add(config,"charge", 0, 500);
chargeChanger.onChange(function(value) {
  force.charge(-value)
  force.start()
});

var gravityChanger = fl.add(config,"gravity", 0, 1);
gravityChanger.onChange(function(value) {
  force.gravity(value)
  force.start()
});

var thetaChanger = fl.add(config,"theta", 0, 1);
thetaChanger.onChange(function(value) {
  force.theta(value)
  force.start()
});

var width = window.innerWidth,
    height = window.innerHeight - 5,
    fill = d3.scale.category20(),
    nodes = [{x: width/2, y: height/2}],
    links = [];

var projection = projections[config["projection"]]
    .scale(height/2)
    .translate([(width/2)-125, height/2])
    .clipAngle(config["clip"] ? 90 : null)

var path = d3.geo.path()
    .projection(projection)

var force = d3.layout.force()
    .linkDistance(config["linkDistance"])
    .linkStrength(config["linkStrength"])
    .gravity(config["gravity"])
    .size([width, height])
    .charge(-config["charge"]);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .call(d3.behavior.drag()
      .origin(function() { var r = projection.rotate(); return {x: 2 * r[0], y: -2 * r[1]}; })
      .on("drag", function() { force.start(); var r = [d3.event.x / 2, -d3.event.y / 2, projection.rotate()[2]]; t0 = Date.now(); origin = r; projection.rotate(r); }))

for(x=0;x<100;x++){
  source = nodes[~~(Math.random() * nodes.length)]
  target = {x: source.x + Math.random(), y: source.y + Math.random(), group: Math.random()}
  links.push({source: source, target: target})
  nodes.push(target)
}

var link = svg.selectAll(".link")
    .data(dataset.edges)
    .enter().append("path").attr("class", "link")

var node = svg.selectAll(".node")
    .data(dataset.nodes)
    .enter()
    .append("g")
    .attr("class", "node")
    .style("cursor","pointer")
    .call(force.drag);

// add the nodes
node.append("circle")
    .attr("r", 35)
    .style("fill", function(d) {
      if (d.color) {return d.color;}
      else  { return "#fff"; }
   });


// add the text 
node.append("text")
    .attr("x", 12)
    .attr("dy", ".35em")
    .text(function(d) { return d.name; });
force
    .nodes(dataset.nodes)
    .links(dataset.edges)
    .on("tick", tick)
    .start();

function tick() {
  node.attr("transform", function(d) { 
    
    var p = path.centroid({"type":"Feature","geometry":{"type":"Point","coordinates":[d.x, d.y]}});
    
    return "translate(" + p + ")";

  });  

  link.attr("d", function(d) { var p = path({"type":"Feature","geometry":{"type":"LineString","coordinates":[[d.source.x, d.source.y],[d.target.x, d.target.y]]}}); return p ? p : 'M 0 0' });
}

// action to take on mouse click
function click() {
    d3.select(this).select("text").transition()
        .duration(750)
        .attr("x", 22)
        .style("fill", "steelblue")
        .style("stroke", "lightsteelblue")
        .style("stroke-width", ".5px")
        .style("font", "20px sans-serif");
    d3.select(this).select("circle").transition()
        .duration(750)
        .attr("r", 16)
        .style("fill", "lightsteelblue");
}

// action to take on mouse double click
function dblclick() {
    d3.select(this).select("circle").transition()
        .duration(750)
        .attr("r", 6)
        .style("fill", "#ccc");
    d3.select(this).select("text").transition()
        .duration(750)
        .attr("x", 12)
        .style("stroke", "none")
        .style("fill", "black")
        .style("stroke", "none")
        .style("font", "10px sans-serif");
}
body {
  padding: 0;
  margin: 0;
  background:#222;
}
.node {
  stroke-width: 2.5px;
  width:100px;
  fill:#fff;
}
text {
  fill: #fff;
  font: 10px sans-serif;
  pointer-events: none;
}
circle {
  fill: #ccc;
  stroke: #fff;
  stroke-width: 1.5px;
}

path.link {
  stroke: #fff;
  fill-opacity: 0
}
svg {
  height:100%;
  width:100%;
  display:block;
}
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/dat-gui/0.5/dat.gui.min.js"></script>

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

d3力指向レイアウトは再加熱時に拡張します

分類Dev

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

分類Dev

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

分類Dev

d3jsはアニメーションテキストを円グラフに表示します

分類Dev

d3jsツリーレイアウトのルートノードにクラスを追加する

分類Dev

D3:力のレイアウトで2つの異なるg要素間で円を移動します

分類Dev

動的に追加されたエッジにラベルを追加するd3jsの強制レイアウト

分類Dev

D3jsで動的に円に画像を追加する方法

分類Dev

ツリーレイアウトのd3jsの座標を更新する

分類Dev

d3円を中心円から遠ざける-力のレイアウト

分類Dev

d3jsは、ポイントが追加されたラインをうまく移行します

分類Dev

d3力指向レイアウトノードにツールチップを表示するにはどうすればよいですか?

分類Dev

D3JS:D3jsを使用して円内にSVGテキスト要素を作成するのに役立ちます

分類Dev

jQueryは、閉じている入力タグを自動的に追加し、レイアウトを壊します

分類Dev

jQueryは、閉じている入力タグを自動的に追加し、レイアウトを壊します

分類Dev

D3力レイアウトグラフのノードとして画像を追加するにはどうすればよいですか?

分類Dev

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

分類Dev

d3jsは特定のテキストラベルの付いた円を選択します

分類Dev

d3.jsの力のレイアウトの重力を長方形にする方法は?

分類Dev

ggplot2を使用してd3.jsの力のレイアウトに似たバブルチャートを作成します

分類Dev

d3jsの線要素に境界線を追加します

分類Dev

Forceレイアウトのd3ノードにテキストラベルを追加します

分類Dev

円グラフでマウスオーバーを使用し、d3jsでラベルを表示します

分類Dev

d3jsでアイテムを削除します

分類Dev

d3jsはオブジェクトをsvgにアタッチします

分類Dev

d3js:円弧の端に円を配置する方法

分類Dev

d3.jsはマウスイベントの円の半径を変更します

分類Dev

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

Related 関連記事

  1. 1

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

  2. 2

    d3力指向レイアウトは再加熱時に拡張します

  3. 3

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

  4. 4

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

  5. 5

    d3jsはアニメーションテキストを円グラフに表示します

  6. 6

    d3jsツリーレイアウトのルートノードにクラスを追加する

  7. 7

    D3:力のレイアウトで2つの異なるg要素間で円を移動します

  8. 8

    動的に追加されたエッジにラベルを追加するd3jsの強制レイアウト

  9. 9

    D3jsで動的に円に画像を追加する方法

  10. 10

    ツリーレイアウトのd3jsの座標を更新する

  11. 11

    d3円を中心円から遠ざける-力のレイアウト

  12. 12

    d3jsは、ポイントが追加されたラインをうまく移行します

  13. 13

    d3力指向レイアウトノードにツールチップを表示するにはどうすればよいですか?

  14. 14

    D3JS:D3jsを使用して円内にSVGテキスト要素を作成するのに役立ちます

  15. 15

    jQueryは、閉じている入力タグを自動的に追加し、レイアウトを壊します

  16. 16

    jQueryは、閉じている入力タグを自動的に追加し、レイアウトを壊します

  17. 17

    D3力レイアウトグラフのノードとして画像を追加するにはどうすればよいですか?

  18. 18

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

  19. 19

    d3jsは特定のテキストラベルの付いた円を選択します

  20. 20

    d3.jsの力のレイアウトの重力を長方形にする方法は?

  21. 21

    ggplot2を使用してd3.jsの力のレイアウトに似たバブルチャートを作成します

  22. 22

    d3jsの線要素に境界線を追加します

  23. 23

    Forceレイアウトのd3ノードにテキストラベルを追加します

  24. 24

    円グラフでマウスオーバーを使用し、d3jsでラベルを表示します

  25. 25

    d3jsでアイテムを削除します

  26. 26

    d3jsはオブジェクトをsvgにアタッチします

  27. 27

    d3js:円弧の端に円を配置する方法

  28. 28

    d3.jsはマウスイベントの円の半径を変更します

  29. 29

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

ホットタグ

アーカイブ