按数组过滤选择而不丢失顺序d3js
Filter selection by array without losing order d3js
我是 d3js 的新手,我想在圆圈表示的图形中的两个节点之间创建动画。
我已经使用函数路径计算了起点和终点之间的最短路径。它 returns 一个圆的 id 数组,表示您必须遵循的从源(开始)到目标(结束)的路径。
像这样:23、24、37、29、30。
var ruta = path(data.pred, start, end);
之后我使用过滤函数select形成起点和终点之间最短路径的节点(圆圈)。
var selection = svg.selectAll('circle').filter(function(d){ return ruta.indexOf(d.index.toString()) >- 1;});
然后,我尝试使用这个简单的过渡动画路径,一个一个地改变圆圈的大小。
selection.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.style("opacity",1.0)
.attr("r", 10.0)
.each("end",function() {
d3.select(this).
transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.attr("r",7)
.style("opacity",0.7);
});
问题是过滤器 selection 丢失了节点的原始顺序。
示例:
原路径:23、24、37、29、30。
选择顺序:23、24、29、30、37.
如何根据原始数组对 selection 对象重新排序?
我按照@LarsKotthoff 的建议使用了.sort()
。这是我的比较器函数,我将原始数组 (ruta) 设为全局,然后我使用 ruta 中的索引位置对选择数组进行排序。
sortItems = function (a, b) {
value_a = ruta.indexOf(a.id.toString());
value_b = ruta.indexOf(b.id.toString())
return value_a - value_b ;
};
这是对选择进行排序的代码
selection
**.sort(sortItems)**
.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.style("opacity",1.0)
.attr("r", 10.0)
.each("end",function() {
d3.select(this)
.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.attr("r",7)
.style("opacity",0.7);
});
我是 d3js 的新手,我想在圆圈表示的图形中的两个节点之间创建动画。
我已经使用函数路径计算了起点和终点之间的最短路径。它 returns 一个圆的 id 数组,表示您必须遵循的从源(开始)到目标(结束)的路径。 像这样:23、24、37、29、30。
var ruta = path(data.pred, start, end);
之后我使用过滤函数select形成起点和终点之间最短路径的节点(圆圈)。
var selection = svg.selectAll('circle').filter(function(d){ return ruta.indexOf(d.index.toString()) >- 1;});
然后,我尝试使用这个简单的过渡动画路径,一个一个地改变圆圈的大小。
selection.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.style("opacity",1.0)
.attr("r", 10.0)
.each("end",function() {
d3.select(this).
transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.attr("r",7)
.style("opacity",0.7);
});
问题是过滤器 selection 丢失了节点的原始顺序。
示例:
原路径:23、24、37、29、30。 选择顺序:23、24、29、30、37.
如何根据原始数组对 selection 对象重新排序?
我按照@LarsKotthoff 的建议使用了.sort()
。这是我的比较器函数,我将原始数组 (ruta) 设为全局,然后我使用 ruta 中的索引位置对选择数组进行排序。
sortItems = function (a, b) {
value_a = ruta.indexOf(a.id.toString());
value_b = ruta.indexOf(b.id.toString())
return value_a - value_b ;
};
这是对选择进行排序的代码
selection
**.sort(sortItems)**
.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.style("opacity",1.0)
.attr("r", 10.0)
.each("end",function() {
d3.select(this)
.transition()
.delay(function(d,i) { return i/ len * enter_duration;})
.attr("r",7)
.style("opacity",0.7);
});