【问题标题】:d3.js arc.centroid(d) : Error: Invalid value for <text> attribute transform="translate(NaN,NaN)"d3.js arc.centroid(d):错误:<text> 属性的值无效 transform="translate(NaN,NaN)"
【发布时间】:2023-03-31 11:22:01
【问题描述】:

我正在尝试使用 D3 documentation 中所述的 centroid() 函数使弧标签居中。

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

但我在 translate css 属性上遇到错误:

错误:属性值无效 transform="翻译(NaN,NaN)"

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

【问题讨论】:

  • 传递给 translate 的参数不是数字。检查一下。
  • 这就是为什么我在 translate 中使用 arc.centroid(d) 作为参数;返回当前基准(d)的中点坐标。

标签: javascript d3.js svg


【解决方案1】:

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

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

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

【讨论】:

  • 您的解决方案完美运行。非常感谢您的解释!
  • 很好的解决方案。谢谢!
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 2015-06-16
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多