d3.js arc.centroid(d):错误:<text>属性变换的值无效=&#34;翻译(NaN,NaN)&#34;

时间:2015-08-17 17:08:05

标签: javascript d3.js svg

我尝试使用 centroid()函数将弧标签居中,如D3 documentation中所述。

arcs.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.text(function(d) { return "labels"; });

但我在翻译css属性上收到错误:

  

错误:属性的值无效   变换=&#34;翻译(NaN时,NAN)&#34;

(d)对象的console.log之一:

.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })

返回:

data: 80
endAngle: 1.9112350744272506
padAngle: 0
startAngle: 0
value: 80
__proto__: Object

这是我的代码:

HTML:

<div id="firstChart"></div>

JS:

var myData = [80,65,12,34,72];
var nbElement = myData.length;
var angle = (Math.PI * 2) / nbElement ;
var myColors = ["#e7d90d", "#4fe70d", "#0de7e0", "#f00000", "#00DC85"];
var width = 1500;
var height = 1500;
var radius = 200;

var canvas = d3.select("#firstChart")
              .append("svg")
              .attr("height", height)
              .attr("width", width);

var group = canvas.append("g")
                .attr("transform","translate(310, 310)");

var arc = d3.svg.arc()
                .innerRadius(0)       
                .outerRadius(function (d,i) { return (myData[i]*2); })
                .startAngle(function (d,i) { return (i*angle); })
                .endAngle(function (d,i) { return (i*angle)+(1*angle); });

var pie = d3.layout.pie()
            .value(function (d) { return d; });

var arcs = group.selectAll(".arc")
            .data(pie(myData))
            .enter()
            .append("g")
            .attr("class", "arc");

arcs.append("path")
    .attr("d", arc)
    .attr("fill", function (d, i) { return ( myColors[i] ); });

arcs.append("text")
    .attr("transform", function(d) {console.log(d); return "translate(" + arc.centroid(d) + ")"; })
    .text(function(d) { return d.data; });

var outlineArc = d3.svg.arc()
        .innerRadius(0)
        .outerRadius(radius)
        .startAngle(function (d,i) { return (i*angle); })
        .endAngle(function (d,i) { return (i*angle)+(1*angle); });

var outerPath = group.selectAll(".outlineArc")
      .data(pie(myData))
    .enter().append("path")
      .attr("fill", "none")
      .attr("stroke", "black")
      .attr("stroke-width", "2")
      .attr("class", "outlineArc")
      .attr("d", outlineArc);   

1 个答案:

答案 0 :(得分:3)

您需要将元素的索引传递给centroid以及基准:

    .attr("transform", function(d, i) { return "translate(" + arc.centroid(d, i) + ")"; })

在致电arc.centroid期间,D3调用您为outerRadiusstartAngleendAngle创建的弧功能。但是,如果您没有将索引传递给arc.centroid,则D3没有索引传递给弧函数,所有这些函数都使用索引。因此,质心计算以NaN s结束。