私はここで私の前の回答から以下のコードを適応:私は、彼らが崩壊しているかどうかを追跡するためにノードにプロパティを追加https://jsfiddle.net/sheilak/jfwkx4f3/
とどのように多く: Collapsible D3 force directed graph with non-tree data
ここフィドルで完全なコードそれらの親ノードのノードは崩壊する。また、リンクが折りたたまれているかどうかにかかわらず、リンクがないグラフがライブラリに表示されないため、ソースノードを折りたたむことはできません。
graph.nodes.forEach(function (d, i) {
graph.nodes[i] = { "name": d };
graph.nodes[i].collapsing = 0; // count of collapsed parent nodes
graph.nodes[i].collapsed = false;
graph.nodes[i].collapsible = false;
});
我々は、フィルタリングのためのソースノードを必要とするので、私は、全体のソースまたはターゲット・ノードではなくインデックスを指すようにリンクするためのコードを変更しました。私はまた、すべてのターゲットノードを折りたたみ可能に設定します。
graph.links.forEach(function(e) {
e.source = graph.nodes.filter(function(n) {
return n.name === e.source;
})[0],
e.target = graph.nodes.filter(function(n) {
return n.name === e.target;
})[0];
e.target.collapsible = true;
});
レイアウトコードを関数にプルして、ノードをクリックするたびに呼び出すことができます。また、グラフのノードとリンクをフィルタリングするコードを追加し、そのノードとその親が折りたたまれているかどうかに基づいてリンクを作成しました。
update();
var nodes, links;
function update() {
nodes = graph.nodes.filter(function(d) {
// return nodes with no collapsed parent nodes
return d.collapsing == 0;
});
links = graph.links.filter(function(d) {
// return only links where source and target are visible
return d.source.collapsing == 0 && d.target.collapsing == 0;
});
// Sankey properties
sankey
.nodes(nodes)
.links(links)
.layout(32);
// I need to call the function that renders the sakey, remove and call it again, or the gradient coloring doesn't apply (I don't know why)
sankeyGen();
svg.selectAll("g").remove();
sankey.align("left").layout(32);
sankeyGen();
}
この行は、クリックハンドラに干渉していたためコメントアウトする必要がありましたが、私はそこで何が変更されたのか分かりません。
.on("start", function() {
//this.parentNode.appendChild(this);
})
折りたたみを実行するためのクリックハンドラが追加されました。
node.on('click', click);
function click(d) {
if (d3.event.defaultPrevented) return;
if (d.collapsible) {
// If it was visible, it will become collapsed so we should decrement child nodes count
// If it was collapsed, it will become visible so we should increment child nodes count
var inc = d.collapsed ? -1 : 1;
recurse(d);
function recurse(sourceNode){
//check if link is from this node, and if so, collapse
graph.links.forEach(function(l) {
if (l.source.name === sourceNode.name){
l.target.collapsing += inc;
recurse(l.target);
}
});
}
d.collapsed = !d.collapsed; // toggle state of node
}
update();
}
私は十分にあなたに感謝できる方法がないので、私はそう感じる!私は本当にこれに答える仕事に感謝します。私は試しましたが、私はそれをすることができませんでした、あなたの答えは私には巨大な学びです!ありがとうございました。 – TheBiro