Update: 看答案D3 如果有足够的空间,在饼图中放置圆弧标签以获得更全面的答案。
If by 避免削波你的意思是<text>
元素不应被随后的遮挡arc,那么这可以通过使<text>
元素出现在.arc
DOM 中的元素。这里显示了一种方法:http://jsfiddle.net/tu3Pk/2/
在这里,我创造了一个新鲜的g.arc-labels
包含标签并出现在 DOM 中的元素g.arcs
.
pie: function (config) {
// ...
var g = svg.selectAll(".arc")
.data(pie(config.data))
.enter()
.append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) {
return color(d.data.name);
});
// Creating a new g for labels
var gLabel = svg.selectAll('.arc-label')
.data(pie(config.data))
.enter()
.append('g')
.attr('class', 'arc-label');
gLabel.append("text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ")";
})
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.name; });
// ...
}
然而,这对易读性没有多大帮助。为了使标签更清晰,您可能需要看一下以下问题:防止 D3 饼图中文本重叠在这种情况下,解决方案如下:http://jsfiddle.net/tu3Pk/3/
// Get the angle on the arc and then rotate by -90 degrees
function getAngle(d) {
var ang = (180 / Math.PI * (d.startAngle + d.endAngle) / 2 - 90);
return (ang > 180) ? 180 - ang : ang;
};
// ...
pie: function (config) {
// ...
gLabel.append("text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ") " +
"rotate(" + getAngle(d) + ")";
})
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.name; });
// ...
}