d3.js 逐个单元格将矩阵元素绑定到网格

ux6nzvsh  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在尝试创建一个动画,其中网格元素以从左到右、从上到下的顺序出现。因此,顺序将是:一个月一个月一个月一个月一个月一个月...
我目前的代码显示网格中一列的所有元素,后面跟着一个延迟,然后是第二列的所有元素,延迟,以此类推。我确信这是因为第56行的索引元素,它控制每个元素的时间延迟,在每一行都重置。我想知道是否有办法解决这个问题,例如具有跟踪d的列号的变量。

var data = [[0,1],[2,3]];

function myMatrix2(data) {

    var margin = {top: 50, right: 100, bottom: 50, left: 100},
        width = 250,
        height = 250;

    const svg = d3
        .select('.grid2')
        .append('svg')
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    numrows = data.length;
    numcols = data[0].length;

    rw=width/numrows;
    hw=height/numcols;

    var x = d3.scaleOrdinal()
        .domain(d3.range(numcols))
        .range(d3.range(0,width,width/numcols));

    var y = d3.scaleOrdinal()
        .domain(d3.range(numrows))
        .range(d3.range(0,height,height/numrows));

    var row = svg.selectAll(".row")
        .data(data)
        .enter().append("g")
        .attr("class", "row")
        .attr("transform", function(d, i) {return "translate(0," + y(i) + ")"; });

    var cell = row.selectAll(".cell")
        .data(function(d) { return d; })
        .enter().append("g")
        .attr("class", "cell")
        .attr("transform", function(d, i) { return "translate(" + x(i) + ", 0)"; });

    cell.append('rect')
        .attr("width", rw)
        .attr("height", hw)
        .style("stroke", "black")
        .style("stroke-width", "2px")
        .style("fill", 'white')

    cell.append("text") //Add matrix elements
        .attr("dy", ".32em")
        .attr("x", rw/2 )
        .attr("y", hw/2 )
        .attr("text-anchor", "middle")
        .style("font-size","14px")
        .transition() //Delay starts here
        .delay(function(d,i) {console.log("D: "+d + " I: "+i); return i*3000;})
        .text(function(d) { return d; })
    return;
};
31moq8wy

31moq8wy1#

有几种方法可以做到这一点。我最喜欢的惯用D3方法之一是使用一个局部变量设置父行的索引...

local.set(this, i);

...然后检索该索引以设置延迟:

.delay(function(d, i) {
    const p = local.get(this);
    return i * 1000 + p * (1000 / numrows);
})

下面是一个3x3矩阵的代码:
第一个

相关问题