D3で重複するパスを交互にまたは防止する

ジェイソン・ヘップラー

アークの重なりを防ぐ方法を見つけたいと思うアーク図を作成しています。ここに動作するbl.ockの例があります

円弧図

この場合の暗い線は、複数のノードが同じエッジを共有する重なり合う線です。おそらく2つのパスを実行することで、これを防ぎたいと思います。最初のパスは、円弧を交互にノードの下ではなく上に移動し、一種のらせんの外観を与えます。リンクを区別するために円弧がすでに上下に存在する場合、2番目の円弧はわずかに大きい円弧を描画します。

var width   = 1000,
    height  = 500,
    margin  = 20,
    pad     = margin / 2,
    radius  = 6,
    yfixed  = pad + radius;

var color = d3.scale.category10();

// Main
//-----------------------------------------------------

function arcDiagram(graph) {
  var radius = d3.scale.sqrt()
    .domain([0, 20])
    .range([0, 15]);

  var svg = d3.select("#chart").append("svg")
      .attr("id", "arc")
      .attr("width", width)
      .attr("height", height);

  // create plot within svg
  var plot = svg.append("g")
    .attr("id", "plot")
    .attr("transform", "translate(" + pad + ", " + pad + ")");

  // fix graph links to map to objects
  graph.links.forEach(function(d,i) {
    d.source = isNaN(d.source) ? d.source : graph.nodes[d.source];
    d.target = isNaN(d.target) ? d.target : graph.nodes[d.target];
  });

  linearLayout(graph.nodes);
  drawLinks(graph.links);
  drawNodes(graph.nodes);
}

// layout nodes linearly
function linearLayout(nodes) {
  nodes.sort(function(a,b) {
    return a.uniq - b.uniq;
  })

  var xscale = d3.scale.linear()
    .domain([0, nodes.length - 1])
    .range([radius, width - margin - radius]);

  nodes.forEach(function(d, i) {
    d.x = xscale(i);
    d.y = yfixed;
  });
}

function drawNodes(nodes) {

  var gnodes = d3.select("#plot").selectAll("g.node")
    .data(nodes)
  .enter().append('g');

  var nodes = gnodes.append("circle")
    .attr("class", "node")
    .attr("id", function(d, i) { return d.name; })
    .attr("cx", function(d, i) { return d.x; })
    .attr("cy", function(d, i) { return d.y; })
    .attr("r", 5)
    .style("stroke", function(d, i) { return color(d.gender); });

  nodes.append("text")
    .attr("dx", function(d) { return 20; })
    .attr("cy", ".35em")
    .text(function(d) { return d.name; })

}

function drawLinks(links) {
  var radians = d3.scale.linear()
  .range([Math.PI / 2, 3 * Math.PI / 2]);

  var arc = d3.svg.line.radial()
    .interpolate("basis")
    .tension(0)
    .angle(function(d) { return radians(d); });

  d3.select("#plot").selectAll(".link")
    .data(links)
  .enter().append("path")
    .attr("class", "link")
    .attr("transform", function(d,i) {
      var xshift = d.source.x + (d.target.x - d.source.x) / 2;
      var yshift = yfixed;
      return "translate(" + xshift + ", " + yshift + ")";
    })
    .attr("d", function(d,i) {
      var xdist = Math.abs(d.source.x - d.target.x);
      arc.radius(xdist / 2);
      var points = d3.range(0, Math.ceil(xdist / 3));
      radians.domain([0, points.length - 1]);
      return arc(points);
    });
}

私が問題に取り組み始める方法についての指針はありますか?

mralexlau

これが参考のためbl.ockです。元のパスは灰色で、提案されたパスは赤で表示されます。

まず、特定のパスが発生した回数のカウントを保存します。

graph.links.forEach(function(d,i) {
  var pathCount = 0;
  for (var j = 0; j < i; j++) {
    var otherPath = graph.links[j];
    if (otherPath.source === d.source && otherPath.target === d.target) {
      pathCount++;
    }
  }

  d.pathCount = pathCount;
});

次に、そのデータを取得したら、放射状の線は円の曲線しか描画できないように見えるため、放射状の線の代わりに楕円を使用します。

d3.select("#plot").selectAll(".ellipse-link")
  .data(links)
.enter().append("ellipse")
  .attr("fill", "transparent")
  .attr("stroke", "gray")
  .attr("stroke-width", 1)
  .attr("cx", function(d) {
    return (d.target.x - d.source.x) / 2 + radius;
  })
  .attr("cy", pad)
  .attr("rx", function(d) {
    return Math.abs(d.target.x - d.source.x) / 2;
  })
  .attr("ry", function(d) {
    return 150 + d.pathCount * 20;
  })
  .attr("transform", function(d,i) {
    var xshift = d.source.x - radius;
    var yshift = yfixed;
    return "translate(" + xshift + ", " + yshift + ")";
  });

ry上記の値を変更すると、さまざまな曲線の高さが変更されることに注意してください

最後に、クリップパスを使用して、実際に表示される各楕円の領域を制限し、ノードの下にのみ表示されるようにする必要があります。(これはbl.ockでは実行されません)

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

D3ズーム可能パックレイアウトでラベルの重複テキストを非表示にする方法は?

分類Dev

D3ズーム可能パックレイアウトでラベルの重複テキストを非表示にする方法は?

分類Dev

D3でパスフィルを完全に削除する

分類Dev

D3 svg パスが重複しています

分類Dev

複数のパスを1つのD3(SVG)にマージする

分類Dev

D3 ForceLayout-重複するリンクはありません

分類Dev

Swashbuckleで生成されたSwaggerは、Azure APIManagementで重複するバージョンパスを作成します

分類Dev

Sublime Text3で重複するタブまたはスクロールするタブを無効にする方法

分類Dev

React / MERNスタックバンドルのサイズを縮小-主に重複するD3を削除

分類Dev

Jquery:重複するクラス(またはdiv)を個別に制御する

分類Dev

D3は、追加された要素に.data()を設定すると、「nullのプロパティ 'ownerDocument'を読み取れません」をスローします

分類Dev

重複クラスの警告を無視または修正するにはどうすればよいですか?

分類Dev

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

分類Dev

d3をクリックすると、パスまたはラインに沿って位置を取得します

分類Dev

要素D3に複数のクラス名を追加する

分類Dev

d3関数で複数のクラスを追加する

分類Dev

D3。複数の要素を単一のデータに関連付けることはできますか?

分類Dev

D3で線のパッチを異なる色にします

分類Dev

D3は、selectAll()ではなくselect()が実行されている場合にのみ、すべてのパスを更新します。

分類Dev

d3ブラシのsvgでパスを作成する方法

分類Dev

SQLXMLBULKLOADLibによる挿入時の重複を防止します

分類Dev

juliaで重複する列にサフィックスまたはプレフィックスを追加するにはどうすればよいですか?

分類Dev

複数行の 3 列にまたがる重複セルを強調表示するにはどうすればよいですか?

分類Dev

d3またはディンプルの軸に表示するインスタンスを単純にカウントする方法はありますか?

分類Dev

d3でバーを異なる色にする方法は?

分類Dev

d3 v4に移行すると、ドラッグ時に重複が発生します

分類Dev

D3ビジュアル(flare.json)でクリックされた要素につながるパスを取得します

分類Dev

マスクを適用すると、d3(d3.svg.arc)によって作成されたSVGパス要素が消えます

分類Dev

クラスパスで重複するJARを検出する方法は?

Related 関連記事

  1. 1

    D3ズーム可能パックレイアウトでラベルの重複テキストを非表示にする方法は?

  2. 2

    D3ズーム可能パックレイアウトでラベルの重複テキストを非表示にする方法は?

  3. 3

    D3でパスフィルを完全に削除する

  4. 4

    D3 svg パスが重複しています

  5. 5

    複数のパスを1つのD3(SVG)にマージする

  6. 6

    D3 ForceLayout-重複するリンクはありません

  7. 7

    Swashbuckleで生成されたSwaggerは、Azure APIManagementで重複するバージョンパスを作成します

  8. 8

    Sublime Text3で重複するタブまたはスクロールするタブを無効にする方法

  9. 9

    React / MERNスタックバンドルのサイズを縮小-主に重複するD3を削除

  10. 10

    Jquery:重複するクラス(またはdiv)を個別に制御する

  11. 11

    D3は、追加された要素に.data()を設定すると、「nullのプロパティ 'ownerDocument'を読み取れません」をスローします

  12. 12

    重複クラスの警告を無視または修正するにはどうすればよいですか?

  13. 13

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

  14. 14

    d3をクリックすると、パスまたはラインに沿って位置を取得します

  15. 15

    要素D3に複数のクラス名を追加する

  16. 16

    d3関数で複数のクラスを追加する

  17. 17

    D3。複数の要素を単一のデータに関連付けることはできますか?

  18. 18

    D3で線のパッチを異なる色にします

  19. 19

    D3は、selectAll()ではなくselect()が実行されている場合にのみ、すべてのパスを更新します。

  20. 20

    d3ブラシのsvgでパスを作成する方法

  21. 21

    SQLXMLBULKLOADLibによる挿入時の重複を防止します

  22. 22

    juliaで重複する列にサフィックスまたはプレフィックスを追加するにはどうすればよいですか?

  23. 23

    複数行の 3 列にまたがる重複セルを強調表示するにはどうすればよいですか?

  24. 24

    d3またはディンプルの軸に表示するインスタンスを単純にカウントする方法はありますか?

  25. 25

    d3でバーを異なる色にする方法は?

  26. 26

    d3 v4に移行すると、ドラッグ時に重複が発生します

  27. 27

    D3ビジュアル(flare.json)でクリックされた要素につながるパスを取得します

  28. 28

    マスクを適用すると、d3(d3.svg.arc)によって作成されたSVGパス要素が消えます

  29. 29

    クラスパスで重複するJARを検出する方法は?

ホットタグ

アーカイブ