3

这个演示(不是我的代码)将两个不同类别的项目相互比较,所以 - 与任何项目可以连接到任何其他项目的和弦图不同 - 咖啡店不能连接到咖啡店并且状态可以' t 连接到状态。

如果 Dunkin' Donuts 先出现,有些挖起杆看起来像这样:

在此处输入图像描述

但是其他楔子看起来像这样,如果星巴克在该州有更高的价值:

在此处输入图像描述

在我看来,不必要的重叠。元素的顺序不应该由它们的值决定,而是由左侧元素的顺序决定——也就是说,总是首先是 Dunkin。

我看到一种发生在

 var chord = d3.layout.chord()
             .padding(.02)
             .sortSubgroups(d3.descending)

但我不确定如何为状态元素指定自定义排序。将咖啡店子组按 desc(或 asc)排序是有意义的,但各州不应得到相同的处理。

我们如何知道和弦是否是一个状态?似乎可以通过将和弦传递给函数的rdr实例来提取信息,该实例将正在排序的 和来自对象的元信息联系起来。chordRdrmatrixmmap

如何创建条件子组排序?

4

2 回答 2

2

简短的回答:你不能在 d3 中做到这一点。

这是 d3 执行排序的方式:

// Sort subgroups…
if (sortSubgroups) {
  subgroupIndex.forEach(function(d, i) {
    d.sort(function(a, b) {
      return sortSubgroups(matrix[i][a], matrix[i][b]);
    });
  });
}

资源

它将对每个子组执行排序。

我能想到的使这项工作合法的唯一方法是拥有一个自定义副本d3.chord.layout(),如果您想玩弄它,可以在上面的链接中找到它。

于 2014-08-07T23:08:07.380 回答
1

我不建议实际使用此解决方案

//all the values in matrix are integers
//we can track the numbers that are starbucks stores
//by adding a small decimal to them
matrix = matrix.map(function(row){
  return row.map(function(d, i){
    return d + (i == row.length - 1 ? 1e-7 : 0) })
})

//now we can do a lexicographic sort 
//first checking for the presence of a decimal and then size
var chord = d3.layout.chord()
    .sortSubgroups(function(a, b){
      if (a != Math.round(a)) return false
      if (b != Math.round(b)) return true
      return b < a ? -1 : b > a ? 1 : 0;
    })

在大多数情况下,使用不需要冗余值矩阵的 更简单的东西进行修改d3.layout.chord或重新开始可能会更好。

于 2015-12-31T01:51:58.643 回答