d3在追加圆

时间:2017-08-21 03:43:48

标签: javascript arrays object d3.js

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

main.html中

<!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>

circle.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');

1 个答案:

答案 0 :(得分:2)

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

var approx_pts = svg.selectAll('circle')

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

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

var approx_pts = svg.selectAll(null)

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

如果您打算使用“更新”和“退出”选项,可以按班级选择:

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

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