d3 在附加圆圈时跳过数组中的第一个索引

1028

我是使用 D3 的新手,我试图通过分成 n 块来均匀地围绕另一个圆圈放置圆圈。问题是即使 coords[0] 存在,它也不会绘制第一个圆。相反,它从 coords[1] 开始并继续。这是什么原因以及如何解决?

主文件

<!doctype html>
<html>
    <head>
        <title>A Circle</title>
        <meta charset="utf-8" />
        <script type="text/javascript" src="https://d3js.org/d3.v4.min.js"></script>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.16.1/math.min.js"></script>
    </head>
    <body>
        <script type="text/javascript" src="circle.js"></script>
    </body>
</html>

圆.js

    var w = 500;
    var h = 500;
    var n = 10;
    var r = h/2-20;
    var coords = [];

    for (var i = 0; i<n; i++)
    {
        var p_i = {};
        p_i.x = w/2+r*math.cos((2*math.pi/n)*i);
        p_i.y = h/2-r*math.sin((2*math.pi/n)*i);
        coords.push(p_i);
    }


    var svg = d3.select('body') //SVG Canvas
        .append('svg')
        .attr('width', w)
        .attr('height', h);

    var circle = svg.append('circle') //Draw Big Circle
        .attr('cx', w/2)
        .attr('cy', h/2)
        .attr('r', r)
        .attr('fill', 'teal')
        .attr('stroke', 'black')
        .attr('stroke-width', w/100);

    var center = svg.append('circle') //Construct Center
        .attr('cx', w/2)
        .attr('cy', h/2)
        .attr('r', r/50)
        .attr('fill', 'red')
        .attr('stroke', 'black')
        .attr('stroke-width', w/100);

    var approx_pts = svg.selectAll('circle')
        .data(coords, function(d)
              {
                  return this.id;
              })
        .enter()
        .append('circle')
        .attr('cx', function(d)
              {
                  return d.x;
              })
        .attr('cy', function(d)
              {
                  return d.y;
              })
        .attr('r', w/100)
        .attr('fill', 'black');
杰拉尔多·费塔朵

执行此操作时,SVG 中已经有圆圈:

var approx_pts = svg.selectAll('circle')

因此,您的“输入”选择的元素少于您的数据数组。

解决方案:只需使用selectAll(null)

var approx_pts = svg.selectAll(null)

这样您就可以确保您的输入选择包含数据数组中的所有元素。当然,这种方法避免了在未来创建“更新”和“退出”选择。

如果您确实打算使用“更新”和“退出”选项,则可以按类别进行选择:

var approx_pts = svg.selectAll(".myCircles")

当然,当您在输入选择中附加这些圆圈时,不要忘记设置该类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章