D3.js 如何更改D3序数标尺的排序顺序?
我一直在与Mike Bostock合作,它很好地错开了序数轴的排序 最初的排序是从左边(从A、B、C…开始)进行的,但反向排序是以相同的顺序(A、B、C…)而不是从左边进行的。这意味着字母开始从看似随机的位置移动,眼睛无法像第一个排序那样容易地跟随它 我一直在试图解决这个问题,但我怀疑这可能是顺序比例的限制:排序顺序是在设置域时指定的顺序。代码的排序元素位于底部D3.js 如何更改D3序数标尺的排序顺序?,d3.js,D3.js,我一直在与Mike Bostock合作,它很好地错开了序数轴的排序 最初的排序是从左边(从A、B、C…开始)进行的,但反向排序是以相同的顺序(A、B、C…)而不是从左边进行的。这意味着字母开始从看似随机的位置移动,眼睛无法像第一个排序那样容易地跟随它 我一直在试图解决这个问题,但我怀疑这可能是顺序比例的限制:排序顺序是在设置域时指定的顺序。代码的排序元素位于底部 var x0 = x.domain(data.sort(this.checked ? function(a, b) { ret
var x0 = x.domain(data.sort(this.checked
? function(a, b) { return b.frequency - a.frequency; }
: function(a, b) { return d3.ascending(a.letter, b.letter); })
.map(function(d) { return d.letter; }))
.copy();
var transition = svg.transition().duration(750),
delay = function(d, i) { return i * 50; };
transition.selectAll(".bar")
.delay(delay)
.attr("x", function(d) { return x0(d.letter); });
transition.select(".x.axis")
.call(xAxis)
.selectAll("g")
.delay(delay);
x0比例被创建为x比例的副本,以提供钢筋过渡的静态参考点,因为x在过渡期间变粗。在这个过程中,我认为x.domain也被设置为目标排序顺序。我原以为在设置一个新域时会重置I值,但事实并非如此:它们会在域顺序的更改中保持不变
如何更改排序顺序,使排序始终从最左边的类别开始?我曾尝试(未成功)在“g”上创建一个人工排序顺序,尝试处理多个域等。我可以使用线性比例实现这一点,但顺序比例应该是一个更简洁、更优雅的解决方案
我已经创建了,所以您可以对此进行试验。根据您的规范,转换的开始将由更新前的顺序决定。也就是说,更新前索引最低的元素应该是第一个。为此,您只需存储和引用转换的旧索引:
.each(function(d, i) { this.old_i = i; })
// ...
delay = function(d, i) { return this.old_i * 250; }
请注意,在转换条和轴标记/标签时,需要同时保存它们的索引
完整的例子。请注意,我还在更新时重新绑定数据——这是在更改回原始数据时使其正常工作所必需的,因为如果只更改比例,索引不会更改。如果我理解您试图正确执行的操作(我不确定我是否正确),则需要考虑元素的上一个索引,而不是新索引:是,这是正确的。你已经有效地告诉了我哪里出了问题:我试图把一个旧的_I钉在each(d)而不是each(this)上。非常感谢Lars-如果你把它放在上面,我会把它当作一个答案。从技术上讲,你也可以用数据而不是DOM来保存它。我会加上它作为回答。谢谢你,拉尔斯。遗憾的是,它没有那么优雅(例如,无法为条和轴标签使用定义的过渡),但它可以工作,这是最主要的。