D3 V4:更新されたデータは新しいデータと見なされていますか?(更新機能)

hiswendy

現在、システムを構築していますが、アップデート機能に問題があります。

基本的に、私はD3ツリーに新しいノードを追加しようとしています。ユーザーがノードの「追加ボタン」をクリックすると、新しい子ノードを追加できます。各追加ボタンは、各ノードの左側にあります。

私はMikeBostockの一般的な更新パターンに従いましたボタンをクリックすると、「新しい」データ要素は新しく作成された子ノードのみになりますが、データ全体が「新しい」ものとして扱われているように見えます。各ノードのクラス名と、中央ノードに到達して消滅するすべてのノードの遷移があるという明らかな事実を調べたときに、この結論に達しました。他の元のデータは「更新」する必要がありますが、そうではありません。なぜこれが起こっているのか、誰かが優しく指摘できますか?

私のコードの実用的なサンプルは、このjfiddleリンクにあります。

06/09編集

Gordonの提案を踏まえて、ノードとリンクの両方に固有のフィールドを見つけました。したがって、データを一意に識別するために、次の変更を加えました。

ノード

.data(d, d => d.data.name)

リンク

.data(d, d => d.source.data.name)

この変更は(ほとんど)機能しますが、いくつかの奇妙な動作がまだ発生していることがわかります。(1)ブランチ7.2.1はまだ新しいノードとして認識され、消えます。(2)2回目の「追加」以降、リンクがそれぞれのノードと適切に整列されていません。私の2つの小さな編集がこれに影響を与えていると思います。元のコードに戻ったとき、線が移行しているにもかかわらず、線が適切に描画されているからです。考え?助言?


HTML

  <div id="div-mindMap">

CSS

.linkMindMap {
    fill: none;
    stroke: #555;
    stroke-opacity: 0.4;
}    
rect {
    fill: white;
    stroke: #3182bd;
    stroke-width: 1.5px;  
 }

JS

const widthMindMap = 700;
const heightMindMap = 700;
let parsedData;

let parsedList = {
  "name": " Stapler",
  "children": [{
      "name": " Bind",
      "children": []
    },
    {
      "name": "   Nail",
      "children": []
    },
    {
      "name": "   String",
      "children": []
    },
    {
      "name": " Glue",
      "children": [{
          "name": "Gum",
          "children": []
        },
        {
          "name": "Sticky Gum",
          "children": []
        }
      ]
    },
    {
      "name": " Branch 3",
      "children": []
    },
    {
      "name": " Branch 4",
      "children": [{
          "name": "   Branch 4.1",
          "children": []
        },
        {
          "name": "   Branch 4.2",
          "children": []
        },
        {
          "name": "   Branch 4.1",
          "children": []
        }
      ]
    },
    {
      "name": " Branch 5",
      "children": []
    },
    {
      "name": " Branch 6",
      "children": []
    },
    {
      "name": " Branch 7",
      "children": []
    },
    {
      "name": "   Branch 7.1",
      "children": []
    },
    {
      "name": "   Branch 7.2",
      "children": [{
          "name": "   Branch 7.2.1",
          "children": []
        },
        {
          "name": "   Branch 7.2.1",
          "children": []
        }
      ]
    }
  ]
}


let svgMindMap = d3.select('#div-mindMap')
  .append("svg")
  .attr("id", "svg-mindMap")
  .attr("width", widthMindMap)
  .attr("height", heightMindMap);


let backgroundLayer = svgMindMap.append('g')
  .attr("width", widthMindMap)
  .attr("height", heightMindMap)
  .attr("class", "background")

let gLeft = backgroundLayer.append("g")
  .attr("transform", "translate(" + widthMindMap / 2 + ",0)")
  .attr("class", "g-left");
let gLeftLink = gLeft.append('g')
  .attr('class', 'g-left-link');
let gLeftNode = gLeft.append('g')
  .attr('class', 'g-left-node');


function loadMindMap(parsed) {
  var data = parsed;
  var split_index = Math.round(data.children.length / 2);

  parsedData = {
    "name": data.name,
    "children": JSON.parse(JSON.stringify(data.children.slice(split_index)))
  };

  var left = d3.hierarchy(parsedData, d => d.children);

  drawLeft(left, "left");
}

// draw single tree
function drawLeft(root, pos) {
  var SWITCH_CONST = 1;
  if (pos === "left") SWITCH_CONST = -1;

  update(root, SWITCH_CONST);
}

function update(source, SWITCH_CONST) {
  var tree = d3.tree()
    .size([heightMindMap, SWITCH_CONST * (widthMindMap - 150) / 2]);
  var root = tree(source);

  console.log(root)

  var nodes = root.descendants();
  var links = root.links();

  console.log(nodes)
  console.log(links)
  // Set both root nodes to be dead center vertically
  nodes[0].x = heightMindMap / 2

  //JOIN new data with old elements
  var link = gLeftLink.selectAll(".link-left")
    .data(links, d => d)
    .style('stroke-width', 1.5);

  var linkEnter = link.enter().append("path")
    .attr("class", "linkMindMap link-left")
    .attr("d", d3.linkHorizontal()
      .x(d => d.y)
      .y(d => d.x));

  var linkUpdate = linkEnter.merge(link);

  linkUpdate.transition()
    .duration(750)
  var linkExit = link.exit()
    .transition()
    .duration(750)
    .attr('x1', function(d) {
      return root.x;
    })
    .attr('y1', function(d) {
      return root.y;
    })
    .attr('x2', function(d) {
      return root.x;
    })
    .attr('y2', function(d) {
      return root.y;
    })
    .remove();

  //JOIN new data with old elements
  var node = gLeftNode.selectAll(".nodeMindMap-left")
    .data(nodes, d => d);

  console.log(nodes);


  //ENTER new elements present in new data
  var nodeEnter = node.enter().append("g").merge(node)
    .attr("class", function(d) {
      return "nodeMindMap-left " + "nodeMindMap" + (d.children ? " node--internal" : " node--leaf");
    })
    .classed("enter", true)
    .attr("transform", function(d) {
      return "translate(" + d.y + "," + d.x + ")";
    })
    .attr("id", function(d) {
      let str = d.data.name;
      str = str.replace(/\s/g, '');
      return str;
    });

  nodeEnter.append("circle")
    .attr("r", function(d, i) {
      return 2.5
    });

  var addLeftChild = nodeEnter.append("g")
    .attr("class", "addHandler")
    .attr("id", d => {
      let str = d.data.name;
      str = "addHandler-" + str.replace(/\s/g, '');
      return str;
    })
    .style("opacity", "1")
    .on("click", (d, i, nodes) => addNewLeftChild(d, i, nodes));

  addLeftChild.append("line")
    .attr("x1", -74)
    .attr("y1", 1)
    .attr("x2", -50)
    .attr("y2", 1)
    .attr("stroke", "#85e0e0")
    .style("stroke-width", "2");

  addLeftChild.append("rect")
    .attr("x", "-77")
    .attr("y", "-7")
    .attr("height", 15)
    .attr("width", 15)
    .attr("rx", 5)
    .attr("ry", 5)
    .style("stroke", "#444")
    .style("stroke-width", "1")
    .style("fill", "#ccc");

  addLeftChild.append("line")
    .attr("x1", -74)
    .attr("y1", 1)
    .attr("x2", -65)
    .attr("y2", 1)
    .attr("stroke", "#444")
    .style("stroke-width", "1.5");

  addLeftChild.append("line")
    .attr("x1", -69.5)
    .attr("y1", -3)
    .attr("x2", -69.5)
    .attr("y2", 5)
    .attr("stroke", "#444")
    .style("stroke-width", "1.5");

  // .call(d3.drag().on("drag", dragged));;

  nodeEnter.append("foreignObject")
    .style("fill", "blue")
    .attr("x", -50)
    .attr("y", -7)
    .attr("height", "20px")
    .attr("width", "100px")
    .append('xhtml:div')
    .append('div')
    .attr("class", 'clickable-node')
    .attr("id", function(d) {
      let str = d.data.name;
      str = "div-" + str.replace(/\s/g, '');
      return str;
    })
    .attr("ondblclick", "this.contentEditable=true")
    .attr("onblur", "this.contentEditable=false")
    .attr("contentEditable", "false")
    .style("text-align", "center")
    .text(d => d.data.name);

  //TODO: make it dynamic
  nodeEnter.insert("rect", "foreignObject")
    .attr("ry", 6)
    .attr("rx", 6)
    .attr("y", -10)
    .attr("height", 20)
    .attr("width", 100)
    // .filter(function(d) { return d.flipped; })
    .attr("x", -50)
    .classed("selected", false)
    .attr("id", function(d) {
      let str = d.data.name;
      str = "rect-" + str.replace(/\s/g, '');
      return str;
    });

  var nodeUpdate = nodeEnter.merge(node);
  // Transition to the proper position for the node
  nodeUpdate.transition()
    .duration(750)
    .attr("transform", function(d) {
      return "translate(" + d.y + "," + d.x + ")";
    });

  // Remove any exiting nodes
  var nodeExit = node.exit()
    .transition()
    .duration(750)
    .attr("transform", function(d) {
      return "translate(" + source.y + "," + source.x + ")";
    })
    .remove();

  // On exit reduce the node circles size to 0
  nodeExit.select('circle').attr('r', 0);
  // node = nodeEnter.merge(node)
}

function addNewLeftChild(d, i, nodes) {
  console.log("make new child");
  event.stopPropagation();
  var newNodeObj = {
    // name: new Date().getTime(),
    name: "New Child",
    children: []
  };

  console.log("this is ", parsedData)
  //Creates new Node
  var newNode = d3.hierarchy(newNodeObj);
  newNode.depth = d.depth + 1;
  newNode.height = d.height - 1;
  newNode.parent = d;
  newNode.id = Date.now();

  console.log(newNode);
  console.log(d)

  if (d.data.children.length == 0) {
    console.log("i have no children")
    d.children = []
  }
  d.children.push(newNode)
  d.data.children.push(newNode.data)

  console.log(d)
  let foo = d3.hierarchy(parsedData, d => d.children) 
  drawLeft(foo, "left");
}


loadMindMap(parsedList);
スティーブ

起こっていることがいくつかあります:

一意のキーの使用

新しいノードはそれぞれ同じ名前(「新しい子」)を持っているため、名前の使用はキーに最適ではありません。代わりに、ある種のIDシステムを使用する方がおそらく良いでしょう。各ノードのデータにIDをタグ付けする簡単な関数を次に示します。

let currNodeId = 0;
function idData(node) {
  node.nodeId = ++currNodeId;
  node.children.forEach(idData);
}
idData(parsedList);

また、でデータを再定義しているので、parsedDataそこでもidプロパティを使用する必要があります。

  parsedData = {
    "name": data.name,
    "nodeId": data.nodeId,
    "children": JSON.parse(JSON.stringify(data.children.slice(split_index)))
  };

新しいノードを追加するときは、nodeDataで設定することもできます。

  var newNodeObj = {
    // name: new Date().getTime(),
    name: "New Child",
    nodeId: ++currNodeId,
    children: []
  };

次に、実際.nodeIdにノードのキーとして使用するには、それをキー関数として使用します。

    .data(nodes, d => d.data.nodeId);

リンクの場合、これはツリーであり、子ごとに1つのリンクしかないため(1つの親に対して複数のリンクでtargetなく)、代わりに使用する必要sourceがあります。

    .data(nodes, d => d.target.data.nodeId);

複数のノード要素が追加されないようにする

新しい要素を追加する前に、新しいノードと古いノードをマージするという問題もあります。これを防ぐには、変更する必要があります

node.enter().append("g").merge(node)

に:

node.enter().append("g")

リンク遷移

最後に、リンクの遷移はノードとともに遷移していません。それらを移行させるには、次を移動します。

    .attr("d", d3.linkHorizontal()
      .x(d => d.y)
      .y(d => d.x));

下に

  linkUpdate.transition()
    .duration(750)

まとめると、次のようになります:https//jsfiddle.net/v9wyb6q4/

または:

const widthMindMap = 700;
const heightMindMap = 700;
let parsedData;

let parsedList = {
  "name": " Stapler",
  "children": [{
      "name": " Bind",
      "children": []
    },
    {
      "name": "   Nail",
      "children": []
    },
    {
      "name": "   String",
      "children": []
    },
    {
      "name": " Glue",
      "children": [{
          "name": "Gum",
          "children": []
        },
        {
          "name": "Sticky Gum",
          "children": []
        }
      ]
    },
    {
      "name": " Branch 3",
      "children": []
    },
    {
      "name": " Branch 4",
      "children": [{
          "name": "   Branch 4.1",
          "children": []
        },
        {
          "name": "   Branch 4.2",
          "children": []
        },
        {
          "name": "   Branch 4.1",
          "children": []
        }
      ]
    },
    {
      "name": " Branch 5",
      "children": []
    },
    {
      "name": " Branch 6",
      "children": []
    },
    {
      "name": " Branch 7",
      "children": []
    },
    {
      "name": "   Branch 7.1",
      "children": []
    },
    {
      "name": "   Branch 7.2",
      "children": [{
          "name": "   Branch 7.2.1",
          "children": []
        },
        {
          "name": "   Branch 7.2.1",
          "children": []
        }
      ]
    }
  ]
}
let currNodeId = 0;
function idData(node) {
	node.nodeId = ++currNodeId;
  node.children.forEach(idData);
}
idData(parsedList);

let svgMindMap = d3.select('#div-mindMap')
  .append("svg")
  .attr("id", "svg-mindMap")
  .attr("width", widthMindMap)
  .attr("height", heightMindMap);


let backgroundLayer = svgMindMap.append('g')
  .attr("width", widthMindMap)
  .attr("height", heightMindMap)
  .attr("class", "background")

let gLeft = backgroundLayer.append("g")
  .attr("transform", "translate(" + widthMindMap / 2 + ",0)")
  .attr("class", "g-left");
let gLeftLink = gLeft.append('g')
  .attr('class', 'g-left-link');
let gLeftNode = gLeft.append('g')
  .attr('class', 'g-left-node');


function loadMindMap(parsed) {
  var data = parsed;
  var split_index = Math.round(data.children.length / 2);

  parsedData = {
    "name": data.name,
    "nodeId": data.nodeId,
    "children": JSON.parse(JSON.stringify(data.children.slice(split_index)))
  };

  var left = d3.hierarchy(parsedData, d => d.children);

  drawLeft(left, "left");
}

// draw single tree
function drawLeft(root, pos) {
  var SWITCH_CONST = 1;
  if (pos === "left") SWITCH_CONST = -1;

  update(root, SWITCH_CONST);
}

function update(source, SWITCH_CONST) {
  var tree = d3.tree()
    .size([heightMindMap, SWITCH_CONST * (widthMindMap - 150) / 2]);
  var root = tree(source);

  console.log(root)

  var nodes = root.descendants();
  var links = root.links();

  console.log(nodes)
  console.log(links)
  // Set both root nodes to be dead center vertically
  nodes[0].x = heightMindMap / 2

  //JOIN new data with old elements
  var link = gLeftLink.selectAll(".link-left")
    .data(links, d => d.target.data.nodeId)
    .style('stroke-width', 1.5);

  var linkEnter = link.enter().append("path")
    .attr("class", "linkMindMap link-left");

  var linkUpdate = linkEnter.merge(link);

  linkUpdate.transition()
    .duration(750)
    .attr("d", d3.linkHorizontal()
      .x(d => d.y)
      .y(d => d.x));
  var linkExit = link.exit()
    .transition()
    .duration(750)
    .attr('x1', function(d) {
      return root.x;
    })
    .attr('y1', function(d) {
      return root.y;
    })
    .attr('x2', function(d) {
      return root.x;
    })
    .attr('y2', function(d) {
      return root.y;
    })
    .remove();

  //JOIN new data with old elements
  var node = gLeftNode.selectAll(".nodeMindMap-left")
    .data(nodes, d => d.data.nodeId);

  console.log(nodes);

  
  //ENTER new elements present in new data
  var nodeEnter = node.enter().append("g")
    .attr("class", function(d) {
      return "nodeMindMap-left " + "nodeMindMap" + (d.children ? " node--internal" : " node--leaf");
    })
    .classed("enter", true)
    .attr("transform", function(d) {
      return "translate(" + d.y + "," + d.x + ")";
    })
    .attr("id", function(d) {
      let str = d.data.name;
      str = str.replace(/\s/g, '');
      return str;
    });

  nodeEnter.append("circle")
    .attr("r", function(d, i) {
      return 2.5
    });

  var addLeftChild = nodeEnter.append("g")
    .attr("class", "addHandler")
    .attr("id", d => {
      let str = d.data.name;
      str = "addHandler-" + str.replace(/\s/g, '');
      return str;
    })
    .style("opacity", "1")
    .on("click", (d, i, nodes) => addNewLeftChild(d, i, nodes));

  addLeftChild.append("line")
    .attr("x1", -74)
    .attr("y1", 1)
    .attr("x2", -50)
    .attr("y2", 1)
    .attr("stroke", "#85e0e0")
    .style("stroke-width", "2");

  addLeftChild.append("rect")
    .attr("x", "-77")
    .attr("y", "-7")
    .attr("height", 15)
    .attr("width", 15)
    .attr("rx", 5)
    .attr("ry", 5)
    .style("stroke", "#444")
    .style("stroke-width", "1")
    .style("fill", "#ccc");

  addLeftChild.append("line")
    .attr("x1", -74)
    .attr("y1", 1)
    .attr("x2", -65)
    .attr("y2", 1)
    .attr("stroke", "#444")
    .style("stroke-width", "1.5");

  addLeftChild.append("line")
    .attr("x1", -69.5)
    .attr("y1", -3)
    .attr("x2", -69.5)
    .attr("y2", 5)
    .attr("stroke", "#444")
    .style("stroke-width", "1.5");

  // .call(d3.drag().on("drag", dragged));;

  nodeEnter.append("foreignObject")
    .style("fill", "blue")
    .attr("x", -50)
    .attr("y", -7)
    .attr("height", "20px")
    .attr("width", "100px")
    .append('xhtml:div')
    .append('div')
    .attr("class", 'clickable-node')
    .attr("id", function(d) {
      let str = d.data.name;
      str = "div-" + str.replace(/\s/g, '');
      return str;
    })
    .attr("ondblclick", "this.contentEditable=true")
    .attr("onblur", "this.contentEditable=false")
    .attr("contentEditable", "false")
    .style("text-align", "center")
    .text(d => d.data.name);

  //TODO: make it dynamic
  nodeEnter.insert("rect", "foreignObject")
    .attr("ry", 6)
    .attr("rx", 6)
    .attr("y", -10)
    .attr("height", 20)
    .attr("width", 100)
    // .filter(function(d) { return d.flipped; })
    .attr("x", -50)
    .classed("selected", false)
    .attr("id", function(d) {
      let str = d.data.name;
      str = "rect-" + str.replace(/\s/g, '');
      return str;
    });

  var nodeUpdate = nodeEnter.merge(node);
  // Transition to the proper position for the node
  nodeUpdate.transition()
    .duration(750)
    .attr("transform", function(d) {
      return "translate(" + d.y + "," + d.x + ")";
    });

  // Remove any exiting nodes
  var nodeExit = node.exit()
    .transition()
    .duration(750)
    .attr("transform", function(d) {
      return "translate(" + source.y + "," + source.x + ")";
    })
    .remove();

  // On exit reduce the node circles size to 0
  nodeExit.select('circle').attr('r', 0);
  // node = nodeEnter.merge(node)
}

function addNewLeftChild(d, i, nodes) {
  console.log("make new child");
  event.stopPropagation();
  var newNodeObj = {
    // name: new Date().getTime(),
    name: "New Child",
    nodeId: ++currNodeId,
    children: []
  };
  
  console.log("this is ", parsedData)
  //Creates new Node
  var newNode = d3.hierarchy(newNodeObj);
  newNode.depth = d.depth + 1;
  newNode.height = d.height - 1;
  newNode.parent = d;
  newNode.id = Date.now();

  console.log(newNode);
  console.log(d)

  if (d.data.children.length == 0) {
    console.log("i have no children")
    d.children = []
  }
  d.children.push(newNode)
  d.data.children.push(newNode.data)

  console.log(d)
  let foo = d3.hierarchy(parsedData, d => d.children) 
  drawLeft(foo, "left");
}


loadMindMap(parsedList);
.linkMindMap {
    fill: none;
    stroke: #555;
    stroke-opacity: 0.4;
}    
rect {
    fill: white;
    stroke: #3182bd;
    stroke-width: 1.5px;  
 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
  <div id="div-mindMap">

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

CakePHP 3、関連データは更新されずに新規として保存されていますか?

分類Dev

enter()とexit()はD3で更新されたデータをどのように検出しますか?

分類Dev

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

分類Dev

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

分類Dev

d3 queue().defer() を介して取得したデータはいつ表示されますか

分類Dev

D3:データオブジェクトの値は変更されましたが、テーブルで更新されていません

分類Dev

d3棒グラフのラベルが新しいデータでグラフを更新しても更新されない

分類Dev

データは変更されますが、リロードしても新しいデータはフェッチされません、D3

分類Dev

D3 v4 の更新パターンを使用してネストされた子ノードを更新する方法

分類Dev

D3 + ReactNative-X位置が変更されてもデータポイント値が更新されない

分類Dev

D3データの更新が正しく機能しない

分類Dev

d3を使用して凡例データを更新できませんでした。変更されたデータの入力は空です

分類Dev

D3はデータに基づいて色を更新します

分類Dev

データが更新されたときにReact / D3でクリックイベントが更新されない

分類Dev

d3.jsは、軸の更新に続いてネストされたデータサークル(enter.merge())を更新しますか?

分類Dev

D3線/面グラフは順序付けられていないデータで機能しますか?

分類Dev

D3 x 軸にすべてのデータが表示されない

分類Dev

d3はjsonを更新しましたが、新しいデータにアクセスしません

分類Dev

AWS AthenaはS3に保存されているデータを更新または挿入できますか?

分類Dev

データが更新されたときに再利用可能なd3.jsグラフを更新するにはどうすればよいですか?

分類Dev

d3チャートが正しく更新されない

分類Dev

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

分類Dev

d3:DOMを更新しないデータセットを更新する

分類Dev

nvd3 / svgが新しいデータで更新されない

分類Dev

設定したd3ストロークスタイルがデバッガーでは空の文字列として表示されますが、画面では赤で表示されるのはなぜですか?ストロークスタイルにアクセスするにはどうすればよいですか?

分類Dev

このd3コードはどのようにv3からv4に更新されますか?

分類Dev

D3.JS V4は、データを追加/更新した後にグラフ要素を更新します

分類Dev

v3からv4への移行-ツールチップがd3に表示されない

分類Dev

d3グラフのデータを更新するにはどうすればよいですか?

Related 関連記事

  1. 1

    CakePHP 3、関連データは更新されずに新規として保存されていますか?

  2. 2

    enter()とexit()はD3で更新されたデータをどのように検出しますか?

  3. 3

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

  4. 4

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

  5. 5

    d3 queue().defer() を介して取得したデータはいつ表示されますか

  6. 6

    D3:データオブジェクトの値は変更されましたが、テーブルで更新されていません

  7. 7

    d3棒グラフのラベルが新しいデータでグラフを更新しても更新されない

  8. 8

    データは変更されますが、リロードしても新しいデータはフェッチされません、D3

  9. 9

    D3 v4 の更新パターンを使用してネストされた子ノードを更新する方法

  10. 10

    D3 + ReactNative-X位置が変更されてもデータポイント値が更新されない

  11. 11

    D3データの更新が正しく機能しない

  12. 12

    d3を使用して凡例データを更新できませんでした。変更されたデータの入力は空です

  13. 13

    D3はデータに基づいて色を更新します

  14. 14

    データが更新されたときにReact / D3でクリックイベントが更新されない

  15. 15

    d3.jsは、軸の更新に続いてネストされたデータサークル(enter.merge())を更新しますか?

  16. 16

    D3線/面グラフは順序付けられていないデータで機能しますか?

  17. 17

    D3 x 軸にすべてのデータが表示されない

  18. 18

    d3はjsonを更新しましたが、新しいデータにアクセスしません

  19. 19

    AWS AthenaはS3に保存されているデータを更新または挿入できますか?

  20. 20

    データが更新されたときに再利用可能なd3.jsグラフを更新するにはどうすればよいですか?

  21. 21

    d3チャートが正しく更新されない

  22. 22

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

  23. 23

    d3:DOMを更新しないデータセットを更新する

  24. 24

    nvd3 / svgが新しいデータで更新されない

  25. 25

    設定したd3ストロークスタイルがデバッガーでは空の文字列として表示されますが、画面では赤で表示されるのはなぜですか?ストロークスタイルにアクセスするにはどうすればよいですか?

  26. 26

    このd3コードはどのようにv3からv4に更新されますか?

  27. 27

    D3.JS V4は、データを追加/更新した後にグラフ要素を更新します

  28. 28

    v3からv4への移行-ツールチップがd3に表示されない

  29. 29

    d3グラフのデータを更新するにはどうすればよいですか?

ホットタグ

アーカイブ