Javascript 防止d3和弦重叠

Javascript 防止d3和弦重叠,javascript,d3.js,svg,chord-diagram,Javascript,D3.js,Svg,Chord Diagram,(不是我的代码)将两种不同类别的项目相互比较,因此,与弦图中任何项目都可以连接到任何其他项目不同,咖啡馆不能连接到咖啡馆,州也不能连接到州 如果Dunkin油炸圈饼排在第一位,有些楔子看起来像这样: 但如果星巴克在该州有更高的价值,其他楔子看起来是这样的: 在我看来,不必要的重叠。元素的顺序不应该由它们的值决定,而是由左侧元素的顺序决定——也就是说,总是先邓肯 我看到一种情况正在发生 var chord = d3.layout.chord() .padding(.

(不是我的代码)将两种不同类别的项目相互比较,因此,与弦图中任何项目都可以连接到任何其他项目不同,咖啡馆不能连接到咖啡馆,州也不能连接到州

如果Dunkin油炸圈饼排在第一位,有些楔子看起来像这样:

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

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

我看到一种情况正在发生

 var chord = d3.layout.chord()
             .padding(.02)
             .sortSubgroups(d3.descending)
但我不确定如何为state元素指定自定义排序。将咖啡店的子组分类为desc(或asc)是有意义的,但各州不应得到相同的待遇

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


如何创建条件子组排序?

简短回答:在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()
,如果你想玩弄它,可以在上面的链接中找到

我不建议实际使用这个:

//矩阵中的所有值都是整数
//我们可以追踪星巴克商店的号码
//通过向它们添加一个小的小数点
矩阵=矩阵.map(函数(行){
返回row.map(函数(d,i){
返回d+(i==row.length-1?1e-7:0)})
})
//现在我们可以进行字典排序
//首先检查是否存在小数点,然后检查大小
var chord=d3.layout.chord()
.sortSubgroups(函数(a,b){
如果(a!=Math.round(a))返回false
如果(b!=Math.round(b))返回true
返回ba-1:0;
})

在大多数情况下,修改d3.layout.chord或重新开始不需要冗余的值矩阵可能会更好

是的,说得好。
chord()
函数对矩阵映射一无所知。它只能对数字矩阵进行运算。排序函数还需要
mmap
变量。
//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;
    })