D3.js實現(xiàn)繪制和弦圖的教程詳解
弦圖,是一種表示實體之間相互關(guān)系的圖形方法。直觀的看,弦圖由節(jié)點分段和弧形的邊構(gòu)成。節(jié)點分段沿圓周排列,節(jié)點之間的關(guān)系通過使用弧線或貝塞爾曲線相互連接。值得注意的是,這些弧線是有寬度的,且起止寬度可以不一樣。這本質(zhì)上是因為,弧線的寬度反映了一種矩陣關(guān)系(例如A[1,2]=3,A[2,1]=4),因此取值是雙向的。——圖之典
d3.chord
const population = [ [1000, 3045, 4567, 1234, 3714], [3214, 2000, 2060, 124, 3234], [8761, 6545, 3000, 8045, 647], [3211, 1067, 3214, 4000, 1006], [2146, 1034, 6745, 4764, 5000] ]; const chords = d3.chord()(population); console.log(chords);
chord ( matrix )的返回值是一個chords數(shù)組,其中每個 chord 代表兩個節(jié)點i和j之間的組合雙向流(其中i可能等于j)并且是具有以下屬性的對象:
source
- 該弦的源子分組對象target
- 該弦的目標(biāo)子分組對象
每個源和目標(biāo)子組也是具有以下屬性的對象:
startAngle
- 以弧度為單位的起始角度endAngle
- 以弧度表示的結(jié)束角度value
- 流量值矩陣[ i ] [ j ]index
- 節(jié)點索引i
d3.chord
還有一些屬性:
padAngle
- 設(shè)置或獲取相鄰分組之間的間隔,默認(rèn)為 0sortChords
- 設(shè)置或獲取弦的排序規(guī)則sortGroups
- 設(shè)置或獲取分組的排序規(guī)則sortSubGroups
- 設(shè)置獲取子分組的排序規(guī)則
和弦圖由兩部分組成:分組的環(huán)形圖+表示流量的弦圖,d3.chord
返回的數(shù)據(jù)就是弦數(shù)據(jù),通常傳遞給d3.ribbon
來顯示相互之間的流量關(guān)系,弦圖數(shù)組也包含了另一個表示分組的屬性chords.groups
,表示計算后的分組數(shù)組,分組包含以下屬性:
startAngle
- 起始角度endAngle
- 終止角度value
- 從節(jié)點 i 出去的總量index
- 節(jié)點索引 i
分組數(shù)據(jù)傳遞給d3.arc
來繪制。
弦數(shù)據(jù)和分組數(shù)據(jù)就組成了一個完整的和弦圖。
d3.ribbon
const ribbon = d3.ribbon(); ribbon({ source: {startAngle: 0.7524114, endAngle: 1.1212972, radius: 240}, target: {startAngle: 1.8617078, endAngle: 1.9842927, radius: 240} }); // "M164.0162810494058,-175.21032946354026A240,240,0,0,1,216.1595644740915,-104.28347273835429Q0,0,229.9158815306728,68.8381247563705A240,240,0,0,1,219.77316791012538,96.43523560788266Q0,0,164.0162810494058,-175.21032946354026Z"
從示例我們可以看到,ribbon
通過傳入的數(shù)據(jù)source
和target
就可以幫我們生成一個path路徑,有了路徑就可以輕松的繪制弦圖了。
const ribbon = d3.ribbon() .radius(100); // 指定半徑大小 chordG.selectAll("path") .data(chords) .enter() .append("path") .attr("fill", function (d, i) { return color(i); }) .attr("d", ribbon);
繪制分組環(huán)形圖
通過chrods.groups
數(shù)據(jù),加上d3.arc
就可以輕易的繪制出環(huán)形圖了,這里和D3(v7)入門七:餅圖、環(huán)圖、玫瑰圖,不清楚的可以回顧一下。
//創(chuàng)建繪制器 const arc = d3.arc().innerRadius(100).outerRadius(130); //繪制 groupG.selectAll("path") .data(chords.groups) .enter() .append("path") .attr("fill", function (d, i) { return color(i); }) .attr("d", arc);
總結(jié)
完成的示例,可以點擊查看Demo!
寫到這章,我們可以更清晰的理解一下D3這個庫所做的事——窺一斑而知全豹。
對于折線圖、柱狀圖這類簡單圖形,他提供比例尺、坐標(biāo)軸、以及d3.line
,d3.area
幫我們生成復(fù)雜的path路徑。
對于餅圖、環(huán)圖、弦圖他提供了成對的方法: d3.pie
和d3.arc
,d3.chord
和d3.ribbon
。
核心就是處理數(shù)據(jù)和通過數(shù)據(jù)生成path 路徑,給用戶最簡單的方式來繪制圖表,可以聯(lián)想到后面會介紹到的力向?qū)D、地圖、樹圖都是這般操作。D3幫我們解決了最大的問題:處理數(shù)據(jù)生成關(guān)聯(lián)性,通過數(shù)據(jù)再生成path路徑,就像一個工程車間,我們只需要給原料(數(shù)據(jù)),最后就能得到成品(圖形數(shù)據(jù)),最后怎么包裝(繪制)就由用戶自己控制。
到此這篇關(guān)于D3.js實現(xiàn)繪制和弦圖的教程詳解的文章就介紹到這了,更多相關(guān)D3.js繪制和弦圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS函數(shù)節(jié)流和防抖之間的區(qū)分和實現(xiàn)詳解
本文主要介紹的是關(guān)于JS中比較常用的函數(shù):節(jié)流函數(shù)和防抖函數(shù),從概念、使用場景到代碼簡單實現(xiàn)做了一個詳細(xì)的區(qū)分。感興趣的小伙伴們可以參考一下2019-01-01詳解JS事件循環(huán)及宏任務(wù)微任務(wù)的原理
在js中,我們一般將所有的任務(wù)都分成兩類,一種是同步任務(wù),另外一種是異步任務(wù)。而在異步任務(wù)中,又有著更加細(xì)致的分類,那就是微任務(wù)和宏任務(wù)。本文將詳細(xì)講解這二者的原理與使用,需要的可以參考一下2022-05-05移動端使用localStorage緩存Js和css文的方法(web開發(fā))
這篇文章主要介紹了web移動端使用localStorage緩存Js和css文的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09javascript獲取下拉列表框當(dāng)中的文本值示例代碼
需要將用戶點擊下拉列表當(dāng)中某個選項后,將其所選的內(nèi)容保存起來,下面與大家分享下如何使用js獲取下拉列表框文本值,由此需求的朋友可以參考下2013-07-07