Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
D3.js 如何更改D3序数标尺的排序顺序?_D3.js - Fatal编程技术网

D3.js 如何更改D3序数标尺的排序顺序?

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

我一直在与Mike Bostock合作,它很好地错开了序数轴的排序

最初的排序是从左边(从A、B、C…开始)进行的,但反向排序是以相同的顺序(A、B、C…)而不是从左边进行的。这意味着字母开始从看似随机的位置移动,眼睛无法像第一个排序那样容易地跟随它

我一直在试图解决这个问题,但我怀疑这可能是顺序比例的限制:排序顺序是在设置域时指定的顺序。代码的排序元素位于底部

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来保存它。我会加上它作为回答。谢谢你,拉尔斯。遗憾的是,它没有那么优雅(例如,无法为条和轴标签使用定义的过渡),但它可以工作,这是最主要的。