防止D3中的文本剪辑(Javascript图表)

防止D3中的文本剪辑(Javascript图表),javascript,d3.js,Javascript,D3.js,我正在D3中绘制饼图,但文本剪辑本身有问题: 这是我的绘图功能: pie: function(config) { var width = config.width || 840, height = config.height || 520, radius = Math.min(width, height) / 2; var color = this._color = d3.scale.ordina

我正在D3中绘制饼图,但文本剪辑本身有问题:

这是我的绘图功能:

    pie: function(config)
    {
        var width = config.width || 840,
            height = config.height || 520,
            radius = Math.min(width, height) / 2;

        var color = this._color = d3.scale.ordinal().range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
        var arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(0);
        var pie = d3.layout.pie().sort(null).value(function(d) { return d.value; });

        var svg = d3.select("body").append("svg").attr('id', config.id || 'chart').attr("width", width).attr("height", height)
                    .append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

          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); });

          g.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; });
        return $('#'+(config.id || 'chart'));
    },

有没有一种简单的方法可以防止此类文本剪辑?

更新:有关更全面的答案,请参阅的答案


如果避免剪裁意味着
元素不应被随后的弧遮挡,那么可以通过使
元素出现在DOM中的
.arc
元素之后来实现这一点。一种方法如下所示:

在这里,我创建了一个新的
g.arc-labels
元素,该元素包含标签,并在
g.arcs
之后出现在DOM中

饼图:函数(配置){ // ... var g=svg.selectAll(“.arc”) .data(饼图(配置数据)) .输入() .附加(“g”) .attr(“类”、“弧”); g、 附加(“路径”) .attr(“d”,弧) .style(“填充”,函数(d){ 返回颜色(d.data.name); }); //为标签创建新的g var gLabel=svg.selectAll(“.arc标签”) .data(饼图(配置数据)) .输入() .append('g') .attr('class','arc label'); gLabel.append(“文本”) .attr(“转换”,函数(d){ 返回“平移(“+弧形心(d)+”); }) .attr(“dy”,“.35em”) .style(“文本锚定”、“中间”) .text(函数(d){返回d.data.name;}); // ... }
然而,这对易读性没有多大帮助。为了使标签更清晰,您可能想看看这个问题:在这种情况下,解决方案如下:

//获取圆弧上的角度,然后旋转-90度
函数getAngle(d){
var ang=(180/Math.PI*(d.startAngle+d.endAngle)/2-90);
返回值(ang>180)?180-ang:ang;
};
// ...
饼图:函数(配置){
// ...
gLabel.append(“文本”)
.attr(“转换”,函数(d){
返回“平移(“+弧形心(d)+”)+
“旋转(“+getAngle(d)+”);
})
.attr(“dy”,“.35em”)
.style(“文本锚定”、“中间”)
.text(函数(d){返回d.data.name;});
// ...
}