したがって、ノード、リンク、その他の要素を設定するための次の強制レイアウトグラフコードがあります。
var setLinks = function ()
{
link = visualRoot.selectAll("line.link")
.data(graphData.links)
.enter().append("svg:line")
.attr("class", "link")
.style("stroke-width", function (d) { return nodeStrokeColorDefault; })
.style("stroke", function (d) { return fill(d); })
.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; });
graphData.links.forEach(function (d)
{
linkedByIndex[d.source.index + "," + d.target.index] = 1;
});
};
var setNodes = function ()
{
node = visualRoot.selectAll(".node")
.data(graphData.nodes)
.enter().append("g")
.attr("id", function (d) { return d.id; })
.attr("title", function (d) { return d.name; })
.attr("class", "node")
.on("click", function (d, i) { loadAdditionalData(d.userID, this); })
.call(force.drag)
.on("mouseover", fadeNode(.1)).on("mouseout", fadeNode(1));
};
//append the visual element to the node
var appendVisualElementsToNodes = function ()
{
node.append("circle")
.attr("id", function (d) { return "circleid_" + d.id; })
.attr("class", "circle")
.attr("cx", function (d) { return 0; })
.attr("cy", function (d) { return 0; })
.attr("r", function (d) { return getNodeSize(d); })
.style("fill", function (d) { return getNodeColor(d); })
.style("stroke", function (d) { return nodeStrokeColorDefault; })
.style("stroke-width", function (d) { return nodeStrokeWidthDefault; });
//context menu:
d3.selectAll(".circle").on("contextmenu", function (data, index)
{
d3.select('#my_custom_menu')
.style('position', 'absolute')
.style('left', d3.event.dx + "px")
.style('top', d3.event.dy + "px")
.style('display', 'block');
d3.event.preventDefault();
});
//d3.select("svg").node().oncontextmenu = function(){return false;};
node.append("image")
.attr("class", "image")
.attr("xlink:href", function (d) { return d.profile_image_url; })//"Images/twitterimage_2.png"
.attr("x", -12)
.attr("y", -12)
.attr("width", 24)
.attr("height", 24);
node.append("svg:title")
.text(function (d) { return d.name + "\n" + d.description; });
};
今、色とサイズの依存関係が変更され、異なる色と半径でグラフ円(+すべての追加要素)を再描画する必要があります。それに問題がある。
私がすることができます:
visualRoot.selectAll(".circle").remove();
しかし、'.circles'
に添付したすべての画像はまだあります。
いずれにせよ、どんな助けでも感謝します、説明が十分に明確でないならば私に知らせてください、私はそれを修正しようとします。
追伸graphData.nodes
とd3.selectAll('.nodes')
の違いは何ですか?
あなたの答えはうまくいきますが、後世のために、これらの方法はより一般的です。
HTMLからすべての子を削除します。
d3.select("div.parent").html("");
SVG/HTMLからすべての子を削除します。
d3.select("g.parent").selectAll("*").remove();
.html("")
呼び出しは私のSVGで機能しますが、 innerSVG を使用することの副作用かもしれません。
私の最初のアドバイスは、選択についてd3.js
APIを読むことです: https://github.com/mbostock/d3/wiki/Selections
enter()
コマンドの動作を理解する必要があります( API )。新しいノードを処理するためにそれを使用する必要があるという事実は、あなたを助ける意味があります。
selection.data()
を扱うときの基本的なプロセスは次のとおりです。
まず、選択範囲にデータを「添付」します。だからあなたが持っている:
var nodes = visualRoot.selectAll(".node")
.data(graphData.nodes)
その後、データが変更されるたびにすべてのノードを変更できます(これにより、希望どおりに動作します)。たとえば、ロードした新しいデータセットにある古いノードの半径を変更した場合
nodes.attr("r", function(d){return d.radius})
次に、新しいノードを処理する必要があります。そのためには、新しいノードを選択する必要があります。これがselection.enter()
の目的です。
var nodesEnter = nodes.enter()
.attr("fill", "red")
.attr("r", function(d){return d.radius})
最後に、不要になったノードを削除したいので、これを行うには、選択する必要があります。これがselection.exit()
の目的です。
var nodesRemove = nodes.exit().remove()
プロセス全体の良い例はAPI wikiにもあります: https://github.com/mbostock/d3/wiki/Selections#wiki-exit
このようにして、非常に簡単に解決しました。
visualRoot.selectAll(".circle").remove();
visualRoot.selectAll(".image").remove();
そして、半径と色を計算するコードのプロパティが変更されたため、レンダリングが異なる視覚要素を再追加しました。ありがとうございました。
要素自体を削除したい場合は、 element.remove()
を使用してください。要素のコンテンツを削除するだけで、要素をそのまま保持する場合は、f.exを使用できます。
visualRoot.selectAll(".circle").html(null);
visualRoot.selectAll(".image").html(null);
.html("")
の代わりに(削除する要素の子がわからない)。これは要素自体を保持しますが、含まれるすべてのコンテンツをクリーンアップします。それは これを行う公式の方法 なので、クロスブラウザで動作するはずです。
PS:円のサイズを変更したい。やってみました
d3.selectAll(".circle").attr("r", newValue);
ノードからすべての要素を削除するには:
var siblings = element.parentNode.childNodes;
for (var i = 0; i < siblings.length; i++) {
for (var j = 0; j < siblings.length; j++) {
siblings[i].parentElement.removeChild(siblings[j]);
}
}`