Tôi đang cố hợp nhất hai ví dụ của Mike: Zoomable Circle Packing + Automatic Text Sizing.Đóng gói vòng tròn có thể phóng to có định kích thước văn bản tự động trong D3.js
Nó hoạt động khi ban đầu được hiển thị ở cấp cao nhất. Tuy nhiên, nếu bạn phóng to đến cấp độ tiếp theo, phông chữ không được định kích thước chính xác.
Tôi không chắc liệu tôi có cần sửa đổi biến đổi hay sửa đổi phần tính toán kích thước phông chữ hay không.
Dưới đây là codepen tôi: http://codepen.io/anon/pen/GJWqrL
var circleFill = function(d) {
if (d['color']) {
return d.color;
} else {
return d.children ? color(d.depth) : '#FFF';
}
}
var calculateTextFontSize = function(d) {
return Math.min(2 * d.r, (2 * d.r - 8)/this.getComputedTextLength() * 11) + "px";
}
var margin = 20,
diameter = 960;
var color = d3.scale.linear()
.domain([-1, 18])
.range(["hsl(0,0%,100%)", "hsl(228,30%,40%)"])
.interpolate(d3.interpolateHcl);
var pack = d3.layout.pack()
.padding(2)
.size([diameter - margin, diameter - margin])
.value(function(d) {
return d.size;
})
var svg = d3.select("body").append("svg")
.attr("width", window.innerWidth)
.attr("height", window.innerHeight)
.append("g")
.attr("transform", "translate(" + diameter/2 + "," + diameter/2 + ")");
var focus = root,
nodes = pack.nodes(root),
view;
var circle = svg.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("class", function(d) {
return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root";
})
.style("fill", circleFill)
.on("click", function(d) {
if (focus !== d) zoom(d), d3.event.stopPropagation();
});
circle.append("svg:title")
.text(function(d) {
return d.name;
})
var text = svg.selectAll("text")
.data(nodes)
.enter().append("text")
.attr("class", "label")
.style("fill-opacity", function(d) {
return d.parent === root ? 1 : 0;
})
.style("display", function(d) {
return d.parent === root ? null : "none";
})
.text(function(d) {
return d.name;
})
.style("font-size", calculateTextFontSize)
.attr("dy", ".35em");
var node = svg.selectAll("circle,text");
d3.select("body")
.style("background", color(-1))
.on("click", function() {
zoom(root);
});
zoomTo([root.x, root.y, root.r * 2 + margin]);
function zoom(d) {
var focus0 = focus;
focus = d;
var transition = d3.transition()
.duration(d3.event.altKey ? 7500 : 750)
.tween("zoom", function(d) {
var i = d3.interpolateZoom(view, [focus.x, focus.y, focus.r * 2 + margin]);
return function(t) {
zoomTo(i(t));
};
});
transition.selectAll("text")
.filter(function(d) {
return d.parent === focus || this.style.display === "inline";
})
.style("fill-opacity", function(d) {
return d.parent === focus ? 1 : 0;
})
.each("start", function(d) {
if (d.parent === focus) this.style.display = "inline";
})
.each("end", function(d) {
if (d.parent !== focus) this.style.display = "none";
});
}
function zoomTo(v) {
var k = diameter/v[2];
view = v;
node.attr("transform", function(d) {
return "translate(" + (d.x - v[0]) * k + "," + (d.y - v[1]) * k + ")";
});
circle.attr("r", function(d) {
return d.r * k;
});
}
d3.select(self.frameElement).style("height", diameter + "px");
Nhấp vào tiểu vòng tròn lớn nhất trong "vis" vòng tròn minh họa vấn đề.
https://dl.dropboxusercontent.com/u/3040414/vis-circle.png
Có vẻ với tôi như nó làm việc tốt cho tất cả các phần ngoại trừ vis ở cấp cao nhất. Ngay cả trẻ em của vis là ok. Có điều gì khác về vis? – couchand
Một số vòng kết nối phụ có vẻ tốt, nhưng nhấp vào một số vòng tròn con trong vòng kết nối "Vis" để xem sự cố. https://dl.dropboxusercontent.com/u/3040414/vis-circle.png –
Ngay cả trong dữ liệu của bạn không có vòng kết nối "Vis" ... nếu tôi tìm kiếm JS của bạn thì không có "Vis". Bạn đang nói về cái gì vậy? –