源碼:git
var τ = 2 * Math.PI;
d3.layout.chord = function() { var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; function relayout() { var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; chords = []; groups = []; k = 0, i = -1; while (++i < n) { x = 0, j = -1; while (++j < n) { x += matrix[i][j]; } groupSums.push(x); subgroupIndex.push(d3.range(n)); k += x; } if (sortGroups) { groupIndex.sort(function(a, b) { return sortGroups(groupSums[a], groupSums[b]); }); } if (sortSubgroups) { subgroupIndex.forEach(function(d, i) { d.sort(function(a, b) { return sortSubgroups(matrix[i][a], matrix[i][b]); }); }); }
//k運算以前爲matrix的全部取值的和,運算以後爲單位1數字所表示的角度值 k = (τ - padding * n) / k; x = 0, i = -1; while (++i < n) { x0 = x, j = -1; while (++j < n) { var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; subgroups[di + "-" + dj] = { index: di, subindex: dj, startAngle: a0, endAngle: a1, value: v }; } groups[di] = { index: di, startAngle: x0, endAngle: x, value: (x - x0) / k }; x += padding; } i = -1; while (++i < n) { j = i - 1; while (++j < n) { var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; if (source.value || target.value) { chords.push(source.value < target.value ? { source: target, target: source } : { source: source, target: target }); } } } if (sortChords) resort(); } function resort() { chords.sort(function(a, b) { return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); }); } chord.matrix = function(x) { if (!arguments.length) return matrix; n = (matrix = x) && matrix.length; chords = groups = null; return chord; }; chord.padding = function(x) { if (!arguments.length) return padding; padding = x; chords = groups = null; return chord; }; chord.sortGroups = function(x) { if (!arguments.length) return sortGroups; sortGroups = x; chords = groups = null; return chord; }; chord.sortSubgroups = function(x) { if (!arguments.length) return sortSubgroups; sortSubgroups = x; chords = null; return chord; }; chord.sortChords = function(x) { if (!arguments.length) return sortChords; sortChords = x; if (chords) resort(); return chord; }; chord.chords = function() { if (!chords) relayout(); return chords; }; chord.groups = function() { if (!groups) relayout(); return groups; }; return chord; };
構建新的弦佈局。在默認狀況下,輸入數據並未分類,而且各羣組之間沒有填充。和其餘佈局不一樣,該弦佈局並非應用於數據的函數;相反,數據經過設置關聯矩陣來指定,經過chords和groups訪問器檢索。github
指定矩陣以後,設定該佈局用到的輸入數據矩陣。若是沒有指定矩陣,返回當前數據矩陣,默認爲未定義。輸入矩陣的數字必須爲「方形矩陣」 :[[11975,5871,8916,2868], [1951,10048,2060,6171], [8010,16145,8090,8045], [1013,990,940,6907]]緩存
矩陣的每一行對應一個特定分組,如上文所述某個髮色。矩陣中每一列i同第i行相對應;每一個單元格ij對應表示第i組到第j組之間的關係。函數
If padding is specified, sets the angular padding between groups to the specified value inradians. If padding is not specified, returns the current padding, which defaults to zero. You may wish to compute the padding as a function of the number of groups (the number of rows or columns in the associated matrix). 指定填充以後,在不一樣組之間設定角度填充,爲指定的值(弧度爲單位)。若是沒有指定填充,返回當前填充,默認值爲0。你可能但願計算填充是分組數量(關聯矩陣中行和列的數量)的函數。佈局
若是已經指定comparator,使用指定comparator函數爲佈局設定分組(行)的排列順序。爲每兩行調用comparator函數,傳遞的入參是行i和行j的總和。一般,須要將comparator按照d3.ascending或d3.descending進行指定。若是沒有指定comparator,則返回當前分組排列順序,該順序默認值爲空。spa
若是已經指定comparator,使用指定comparator函數爲佈局設定分組(行內各列)的排列順序。爲每對單元格調用comparator函數,值爲各單元格的值。一般,須要將comparator以升序或降序進行指定。若是沒有指定comparator,則回當前子分組排列順序,該順序默認值爲空。code
若是已經指定comparator,運用指定comparator函數爲弦佈局設定弦(Z順序)的排列順序。爲每兩條弦調用comparator函數,入參爲源單元格和目標單元格的最小值。一般,要將comparator以升序或降序進行指定。若是沒有指定comparator,返回當前chord排列順序,默認值爲空。對象
給定佈局的當前配置和關聯矩陣,返回計算過的弦對象。若是弦對象已計算完畢,本方法返回緩存值。若是佈局屬性有任何改變,則清空以前計算的弦。此時,若是下次調用該方法,須要對佈局進行從新計算。返回對象具備下列屬性: source -描述源對象。 target -描述目標對象。 這兩個對象描述下列實體: index -行索引,i。 subindex索引-列索引,j。 startAngle-弧的起始角,在radians內。 endAngle-弧的終止角,在radians內。 value -關聯單元格ij的數值。 須要注意的是,這些對象同弦很方便爲弦生成器匹配默認的訪問器;但仍能夠對訪問器進行重寫或者修改返回對象,實現佈局微調。blog
給定佈局的當前配置和關聯矩陣,返回計算過的分組對象。若是分組對象已計算完畢,本方法返回緩存值。若是佈局屬性有任何改變,則清空以前計算的分組。此時,若是下次調用該方法,須要對佈局進行從新計算。返回對象具備下列屬性: index -行索引,i。 startAngle -弧的起始角,在radians內。 endAngle -弧的終止角,在radians內。 value -相關行 i的值的總和。 須要注意的是,這些對象同弧度生成器的默認訪問器具備較好的吻合度;但仍能夠對訪問器進行重寫或者修改返回對象,實現佈局微調。索引