这些迷你图的垂直和水平重新定位/重绘需要不同的方法:
垂直调整
对于这个解决方案我正在使用selection.sort
, which:
返回一个新选择,其中包含根据比较函数排序的该选择中每个组的副本。排序后,重新插入元素以匹配结果顺序。
所以,首先,我们设置我们的选择:
var sortedSVG = d3.selectAll(".data-svg")
然后,自从selection.sort
处理数据,我们绑定数据,这是关于你的SVG的索引sorted
array:
.datum(function(d){
return sorted.indexOf(+this.dataset.r)
})
最后,我们按升序比较:
.sort(function(a,b){
return d3.ascending(a,b)
});
请记住,变化是立即的,而不是缓慢而美好的过渡。这是因为元素在 DOM 中被重新定位,并且新的结构会立即绘制。为了实现缓慢的过渡,您必须处理容器 div 内的 HTML 和 CSS(这可能值得提出一个新的具体问题)。
水平调整
这里的问题是从选择中获取所有相关数据:
var sel = d3.selectAll('rect[data-r=\'' + k + '\']')
.each(function() {
arr.push({value:+d3.select(this).attr('data-value'),
pos: +d3.select(this).attr('data-c')});
});
并根据它进行排序data-c
。之后,我们将结果映射到一个简单的数组:
var result = arr.sort(function(a,b){
return sorted.indexOf(a.pos) - sorted.indexOf(b.pos)
}).map(function(d){
return d.value
});
结论
这是更新后的 Plunker:http://next.plnkr.co/edit/85fIXWxmX0l42cHx http://next.plnkr.co/edit/85fIXWxmX0l42cHx or http://plnkr.co/edit/85fIXWxmX0l42cHx http://plnkr.co/edit/85fIXWxmX0l42cHx
PS:您还需要重新定位圆圈。