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

Shrihari Balasubramani

力指向グラフを生成しようとしています。'circle / rect'を使用してノードを描画すると、それを実現できます。しかし、代わりに画像を使用したいと思います。私は何が間違っているのですか?

ノードを作成および変換する方法は次のとおりです(d3 v4を使用しています)。

  var node = svg.append("g")
  .attr("class", "nodes f32")
  .selectAll("img")
  .data(json.nodes)
  .enter().append("img")
  .attr("class","flag ar")
  .call(d3.drag()
      .on("start", dragstarted)
      .on("drag", dragged)
      .on("end", dragended));


function ticked() {
    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; });

    node
    .style("left", function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); })
    .style("top", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); });
}

そして、これが私がこれまでに持っているもののデモです:

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    radius=5;

var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d,index) { return d.id; }).distance(10))
    .force("charge", d3.forceManyBody().distanceMin(10).distanceMax(120))
    .force("center", d3.forceCenter(width / 2, height / 2));

d3.json("https://raw.githubusercontent.com/DealPete/forceDirected/master/countries.json",function(json ) {
  json.nodes.forEach(function(d,i){
    d.id = i;
  })
  
  var link = svg.append("g")
      .attr("class", "links")
    .selectAll("line")
    .data(json.links)
    .enter().append("line")
  .attr("stroke-width","1");
  
    var node = svg.append("g")
      .attr("class", "nodes f32")
    .selectAll("img")
    .data(json.nodes)
    .enter().append("img")
      .attr("class","flag ar")
      .call(d3.drag()
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended));


  function ticked() {
    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; });

    node
    
        .style("left", function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); })
        .style("top", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); });
  }

  simulation
      .nodes(json.nodes)
      .on("tick", ticked);
  
  simulation.force("link")
      .links(json.links);
});

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}
.links line {
    stroke: #999;
    stroke-opacity: 0.6;
}
h1{
  font-family: arial;
}
body{
  display:flex;
  justify-content:center;
  align-items:center;
      flex-direction: column;
    background:#d64d4d;
}
.fdd{
 width:1000px;
  height:500px;
  background: white;
  
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<h1>Force Directed Graph of State Contiguity</h1>
<div class="fdd">
  <svg width="1000" height="500"></svg>
</div>

ザビエルギホット

画像要素を含めるには、の.append("image")代わりにを使用する必要があります.append("img")

また、画像自体をxlink:href属性で指定する必要があります。たとえば、画像へのリンクを提供できます。

これらの2つのポイントを組み合わせると、次のスニペットが得られます。

.append("image")
  .attr("class","flag ar")
  .attr("xlink:href", "https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico")

さらに、ノードの場所がずれているようです。あなたはこのように彼らの位置を設定することができます(それらを翻訳することによって):

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

これがデモです:

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    radius=5;

var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d,index) { return d.id; }).distance(10))
    .force("charge", d3.forceManyBody().distanceMin(10).distanceMax(120))
    .force("center", d3.forceCenter(width / 2, height / 2));

d3.json("https://raw.githubusercontent.com/DealPete/forceDirected/master/countries.json",function(json ) {
  json.nodes.forEach(function(d,i){
    d.id = i;
  })
  
  var link = svg.append("g")
      .attr("class", "links")
    .selectAll("line")
    .data(json.links)
    .enter().append("line")
  .attr("stroke-width","1");
  
    var node = svg.append("g")
      .attr("class", "nodes f32")
    .selectAll("image")
    .data(json.nodes)
    .enter().append("image")
      .attr("class","flag ar")
      .attr("xlink:href", "https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico")
      .attr("height", "32") // width/height (are necessary in Firefox to make the image appear)
      .attr("width", "32")
      .call(d3.drag()
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended));


  function ticked() {
    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; });

    // -16 is half the width/height of the image I used:
    node
      .attr("transform", function(d) { return "translate(" + (d.x - 16) + "," + (d.y - 16) + ")"; })
  }

  simulation
      .nodes(json.nodes)
      .on("tick", ticked);
  
  simulation.force("link")
      .links(json.links);
});

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}
.links line {
    stroke: #999;
    stroke-opacity: 0.6;
}
h1{
  font-family: arial;
}
body{
  display:flex;
  justify-content:center;
  align-items:center;
      flex-direction: column;
    background:#d64d4d;
}
.fdd{
 width:1000px;
  height:500px;
  background: white;
  
}
<script src="https://d3js.org/d3.v4.min.js"></script>

<h1>Force Directed Graph of State Contiguity</h1>
<div class="fdd">
  <svg width="1000" height="500"></svg>
</div>

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

D3折れ線グラフが入力されていません。何が欠けていますか?

分類Dev

Vimは改行を入力として受け入れません

分類Dev

このコードを実行しているときに、このcコードが入力を受け入れないのはなぜですか。このプログラムは何も入力せずに存在し始めています

分類Dev

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

分類Dev

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

分類Dev

新しいノードを追加するD3力指向グラフにより、xとyはNaNになります

分類Dev

D3 v4グラフはバーを更新しませんが、新しい軸データを追加します

分類Dev

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

分類Dev

D3 V4折れ線グラフの拡大に従ってドットを移動するにはどうすればよいですか?

分類Dev

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

分類Dev

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

分類Dev

送信btnが無効になっている場合、事前入力されたフォーム入力要素は最初の入力を受け入れません

分類Dev

mysqlサーバーはIDと日時を新しいレコードとして受け入れません

分類Dev

d3 v4でラベル付きのノードをドラッグすると、レイアウトの不具合が発生します

分類Dev

pythongetpassモジュールはドイツ語の文字を入力として受け取りません

分類Dev

Matplotlib棒グラフは高さ引数として配列を受け入れません

分類Dev

Scala SeqのfilterNot実装は、関数入力パラメーターとして別のリストを受け入れません

分類Dev

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

分類Dev

プロファイル編集は、日付としてテキスト入力を受け入れません

分類Dev

Javaプログラムはユーザー入力の受け入れを停止しません

分類Dev

getLoaderManager()。initLoader()は、サポートライブラリのないクラス(ListFragment)を介して、引数として「this」を受け入れません。

分類Dev

D3力グラフからノードを正しく削除できません

分類Dev

クラスメソッドのパラメータとしてリストを受け入れる-名前 'selected_fields'が定義されていません

分類Dev

新しい-PowerShellのサービスはStartupTypeとしてAutomaticDelayedStartを受け入れません

分類Dev

MySQLは日付としてISO文字列を受け入れていません

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    D3折れ線グラフが入力されていません。何が欠けていますか?

  6. 6

    Vimは改行を入力として受け入れません

  7. 7

    このコードを実行しているときに、このcコードが入力を受け入れないのはなぜですか。このプログラムは何も入力せずに存在し始めています

  8. 8

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

  9. 9

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

  10. 10

    新しいノードを追加するD3力指向グラフにより、xとyはNaNになります

  11. 11

    D3 v4グラフはバーを更新しませんが、新しい軸データを追加します

  12. 12

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

  13. 13

    D3 V4折れ線グラフの拡大に従ってドットを移動するにはどうすればよいですか?

  14. 14

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

  15. 15

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

  16. 16

    送信btnが無効になっている場合、事前入力されたフォーム入力要素は最初の入力を受け入れません

  17. 17

    mysqlサーバーはIDと日時を新しいレコードとして受け入れません

  18. 18

    d3 v4でラベル付きのノードをドラッグすると、レイアウトの不具合が発生します

  19. 19

    pythongetpassモジュールはドイツ語の文字を入力として受け取りません

  20. 20

    Matplotlib棒グラフは高さ引数として配列を受け入れません

  21. 21

    Scala SeqのfilterNot実装は、関数入力パラメーターとして別のリストを受け入れません

  22. 22

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

  23. 23

    プロファイル編集は、日付としてテキスト入力を受け入れません

  24. 24

    Javaプログラムはユーザー入力の受け入れを停止しません

  25. 25

    getLoaderManager()。initLoader()は、サポートライブラリのないクラス(ListFragment)を介して、引数として「this」を受け入れません。

  26. 26

    D3力グラフからノードを正しく削除できません

  27. 27

    クラスメソッドのパラメータとしてリストを受け入れる-名前 'selected_fields'が定義されていません

  28. 28

    新しい-PowerShellのサービスはStartupTypeとしてAutomaticDelayedStartを受け入れません

  29. 29

    MySQLは日付としてISO文字列を受け入れていません

ホットタグ

アーカイブ