首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >d3.js arc.centroid(d):Error:<text>属性transform=的无效值“转换(NaN,NaN)”

d3.js arc.centroid(d):Error:<text>属性transform=的无效值“转换(NaN,NaN)”
EN

Stack Overflow用户
提问于 2015-08-17 17:08:04
回答 1查看 2.1K关注 0票数 1

我试图用centroid()函数对弧标签进行居中,如D3 文档中所述。

代码语言:javascript
复制
arcs.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.text(function(d) { return "labels"; });

但是,我在翻译css属性上有一个错误:

错误:属性transform=的无效值“转换(NaN,NaN)”

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

代码语言:javascript
复制
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })

返回以下内容:

代码语言:javascript
复制
data: 80
endAngle: 1.9112350744272506
padAngle: 0
startAngle: 0
value: 80
__proto__: Object

这是我的密码:

HTML:

代码语言:javascript
复制
<div id="firstChart"></div>

联署材料:

代码语言:javascript
复制
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);   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 19:19:31

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

代码语言:javascript
复制
    .attr("transform", function(d, i) { return "translate(" + arc.centroid(d, i) + ")"; })

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32056030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档