Tôi đã thấy các giải pháp để tạo bố cục nhiều lực trên một trang, trong đó mỗi bố cục được chứa trong SVG của chính nó; tuy nhiên, tôi không thể tìm thấy trợ giúp về cách bao gồm nhiều bố trí lực trong một SVG đơn lẻ. Mỗi bố cục có dữ liệu riêng của nó được liên kết với nó.D3: Nhiều bố trí lực trong một SVG?
Ví dụ về những gì tôi hiện đang làm có thể được tìm thấy tại http://jsfiddle.net/connorgr/SRAJa/. Tôi đã bao gồm phần chính của mã bên dưới. Kết quả cuối cùng trông rất khủng khiếp như bố cục lực lượng không bao giờ được kích hoạt (hoặc xóa) cho tất cả trừ dữ liệu nút/liên kết cuối cùng. Có cách nào để ngăn chặn điều này xảy ra không?
Tôi không thể hợp nhất dữ liệu với nhau và chỉ sử dụng một bố cục vì trường hợp sử dụng cho hình ảnh tôi đang tạo.
/**
* Creates a force layout in svgObj for each element in graphs
* (svg) svgObj - The SVG to include the force layouts in
* (json) graphs - An array of {"nodes":[...],"links":[...]} objects
*/
function generateMultiForce(svgObj, graphs) {
for(var i=0; i < graphs.length; i++) {
var graph = graphs[i];
var graphArea = svgObj.append("g");
var force = d3.layout.force()
.charge(-200)
.linkDistance(45)
.size([width, height])
.nodes(graph.nodes)
.links(graph.links)
.start();
var link = graphArea.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link");
var nodeGroup = graphArea.selectAll("g")
.data(graph.nodes)
.enter().append("g")
.call(force.drag);
var node = nodeGroup.append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function(d) {
return color(d.group); });
var text = nodeGroup.append("text")
.attr("x", 8)
.attr("y", ".31em")
.text(function(d) { return d.name; });
force.on("tick", function() {
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; });
nodeGroup.attr("transform", function(d) {
return "translate("+d.x+","+d.y+")";
});
});
}
}
Dường như với tôi, sự kiện 'tick' là (theo nghĩa) toàn cầu. Tức là, bạn chỉ có thể có một trình xử lý cho một sự kiện 'tick', vì vậy cái cuối cùng bạn cài đặt sẽ được gọi. –
Tìm hiểu kỹ hơn về mã nguồn D3 và dường như điều gì đang xảy ra. Rất tiếc. –