为什么圆形对象位于SVG容器的左上角?

时间:2016-08-25 00:01:10

标签: javascript d3.js svg

下面的代码会生成位于容器左上角的圆圈。我希望它位于与数组值对应的位置。 这是代码:

<script>
   var data = [ 30, 40, 50 ]

   var svg = d3.select("body").append("svg")
            .attr("width", 800)
            .attr("height", 500)
            .style("border", "3px solid black");

   var circles = svg.selectAll("g")
                    .data(data)
                    .enter()
                    .append("g");

   circles.append("circle")
          .attr("cX", function(d) { return d; })
          .attr("cY", function(d) { return d; })
          .attr("r", 50 )
          .style("fill", "steelblue")

   circles.append("text")
          .text( function(d) { return d; })

</script>

这是DOM:

enter image description here

这就是结果:

enter image description here

1 个答案:

答案 0 :(得分:3)

此处的问题是使用cXcY,这在SVG中不存在。属性为cxcy,小写。

所以,这个:

circles.append("circle")
      .attr("cX", function(d) { return d; })
      .attr("cY", function(d) { return d; })
      .attr("r", 50 )
      .style("fill", "steelblue")

应该是这样的:

circles.append("circle")
      .attr("cx", function(d) { return d; })
      .attr("cy", function(d) { return d; })
      .attr("r", 50 )
      .style("fill", "steelblue")

每当你在左上角(SVG原点)获得SVG元素时,怀疑NaN或其他问题设置位置属性(xyx1y1x2y2cxcy等......)。

这是您的代码,仅更改cxcy(并更改数据以便更多地展开圈子):

   var data = [ 100, 200, 300 ]

   var svg = d3.select("body").append("svg")
            .attr("width", 400)
            .attr("height", 400)
            .style("border", "3px solid black");

   var circles = svg.selectAll("g")
                    .data(data)
                    .enter()
                    .append("g");

   circles.append("circle")
          .attr("cx", function(d) { return d; })
          .attr("cy", function(d) { return d; })
          .attr("r", 50 )
          .style("fill", "steelblue")

   circles.append("text")
          .text( function(d) { return d; })
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>