javascript - D3 中带圆圈的两行

标签 javascript d3.js

如何在D3中绘制五行圆圈?

° ° ° ° ° ° ° ° ° ° ° °

° ° ° ° ° ° ° ° ° ° ° ° °

° ° ° ° ° ° ° ° ° ° ° ° °

° ° ° ° ° ° ° ° ° ° ° ° °

° ° ° ° ° ° ° ° ° ° ° ° °

我的 HTML

<body>
     <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="355px" height="355px" viewBox="0 0 351 351" enable-background="new 0 0 351 351" xml:space="preserve">

        <g id="graph">  
        </g>

     </svg>

我是这样开始的:

var svg = d3.select("svg");
var g = svg.select("#graph");
var rectValues = [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 272, 289, 306, 323];

var rect = d3.select("body").select("svg").select("#graph").selectAll("rect")
    .data(rectValues);

     rect.enter().append("rect")
       .attr("rx",100)
       .attr("ry",100)
       .attr("x", function(d) { return d })
       .attr("y", ???)
       .attr("width",15)
       .attr("height",15);

但我不知道我是否必须包含多个数组(数据)“即使 x 和 y 是相同的值”?

这是我的第一个版本。它有效(!),但对于进一步的目的而言,它并不是真正有效的版本。

var rectX;
var rectY = 5;
var svg = d3.select("svg");
var g = svg.select("#graph");

for (var index1 = 0; index1<20; ++index1){
    rectX = 5;

    for (var index2 = 0; index2<20; ++index2) {

    d3.select("body").select("svg").select("#graph").append("rect")
                .attr("rx",100)
                .attr("ry",100)
                .attr("x", rectX)
                .attr("y", rectY)
                .attr("width",15)
                .attr("height",15)
                rectX=rectX+17;
            }
            rectY=rectY+17;
      }

最佳答案

因为圆圈必须一个一个地放在另一个下面,所以 x 不应该是:

var rectValues = [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 272, 289, 306, 323];

应该是

var rectValues = [0, 17, 34, 51, 68, 0, 17, 34, 51, 68,0, 17, 34, 51, 68,0, 17, 34, 51, 68,0, 17, 34, 51, 68,];

这里我在 5 点后重复 x 值,原因是第 6 个圆应该低于第 1 个圆,第 12 个圆应该低于第 6 个圆。 所以第一圈,第六圈,第十二圈。第 18 个圈 ... 都具有相同的 x 值。

注意:在 D3 中,数据驱动文档 (DOM),因此名称 Data Driven D文档 (D3)。

制作一个变量yPos

var yPos = 20;

像这样画圈:

d3.select("body").select("svg").select("#graph").selectAll("rect")
    .data(rectValues);

     rect.enter().append("rect")
       .attr("rx",100)
       .attr("ry",100)
       .attr("x", function(d) { return d })
       .attr("y", function(d, i) { return (yPos * parseInt(i/5)) })
       .attr("width",15)
       .attr("height",15);

看到这一行

.attr("y", function(d, i) { return (yPos * parseInt(i/5)) })

这里的i是正在处理的数组元素的索引。所以这个 parseInt(i/5) 将给我列索引(因此你不需要像你在票证中提到的那样的循环)。

完整的工作代码 here

希望这对您有所帮助!

关于javascript - D3 中带圆圈的两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158428/

相关文章:

javascript - 如何指定 Web MIDI channel ?

Javascript 错误消息,自定义对象表示

javascript - SVG 文本的动态样式

javascript - React d3 - 如何 : Several ares on one line chart

javascript - 更改节点颜色 onclick react-d3-graph

javascript - 在父组件内添加一个具有 N 次的子组件(基于状态值)

javascript - 奇怪的行为querySelector

javascript - 如何从 REACT 中的另一个兄弟或导入组件更新兄弟组件的状态

javascript - D3 条形图 X-ticks 未对齐

javascript - 在 D3 中删除小倍数上不需要的轴