> [Wiki](Home) ? [[API--中文手冊]] ? [[布局]] ? **簇布局**
* 如發現翻譯不當或有其他問題可以通過以下方式聯系譯者:
* 郵箱:zhang_tianxu@sina.com
* QQ群:[D3數據可視化](http://jq.qq.com/?_wv=1027&k=ZGcqYF)205076374,[大數據可視化](http://jq.qq.com/?_wv=1027&k=S8wGMe)436442115
簇布局可以產生樹狀圖:將樹的葉節點放在同一深度的節點連接圖。例如,簇布局可以用來在軟件包層次結構中組織類:
同D3中的其他類一樣,布局遵循方法鏈模式,在該模式下setter方法返回布局本身,允許使用簡單語句調用多個setter。
# d3.layout.cluster()
使用默認設置創建新的簇布局:默認排序為空;默認子訪問器假定每個輸入數據為帶子數組的對象;默認分離函數在同層級使用一個節點寬度,在不同層級使用兩個節點寬度;默認尺寸為1×1。
# cluster(root)
# cluster.nodes(root)
運行簇布局,返回節點數組及指定的根節點。簇數組為D3分層布局家族的一部分。這些布局具有相同的基本結構:布局的輸入參數為分層的根節點,輸出返回值為一個數組,表示計算過的所有節點的位置。每個節點都有各自屬性:
? 上層-父節點,在根節點時為空。
? 下層-子節點數組,在葉節點時為空。
? 深度-節點深度,從根節點計算,值從0開始。
? x-節點位置的x坐標值。
? y-節點位置的y坐標。
雖然布局在x和y軸有值存在,但這表示一個任意坐標系;例如,可以將x坐標視為直徑,將y坐標當做角,從而形成一個射線,而非笛卡爾坐標系布局。
# cluster.links(nodes)
指定節點數組,如以節點形式返回的數組,返回對象節點表示每個節點中父節點同子節點之間的關系。葉節點沒有任何關系。每個節點都是一個具有兩個屬性的對象:
? source -父節點(如上述所示)。
? target -子節點。
該方法在獲取一組關系描述時很有效果,通常與對角圖形生成器共同使用。例如:
svg.selectAll("path")
.data(cluster.links(nodes))
.enter().append("path")
.attr("d", d3.svg.diagonal());
# cluster.children([children])
如果子節點已經指定,則設定子節點訪問器函數。如未指定,則返回當前子節點訪問器函數,該函數將輸入數據默認為帶子數組的對象:
functionchildren(d){
returnd.children;
}
通常,使用d3.json可以方便地加載節點分層,并將輸入分層表示為一個嵌套JSON對象。例如:
{
"name":"flare",
"children":[
{
"name":"analytics",
"children":[
{
"name":"cluster",
"children":[
{"name":"AgglomerativeCluster","size":3938},
{"name":"CommunityStructure","size":3812},
{"name":"MergeEdge","size":743}
]
},
{
"name":"graph",
"children":[
{"name":"BetweennessCentrality","size":3534},
{"name":"LinkDistance","size":5731}
]
}
]
}
]
}
在分層中,子訪問器在根節點首先被調用。如果訪問器返回值為空,則該節點在布局遍歷結束時被假定為葉節點。否則,訪問器需要返回數據元素數組,來表示子節點。
# cluster.sort([comparator])
如已指定comparator,則使用指定的comparator函數設置布局中同級節點排序順序。如comparator未指定,則返回當前分組的排序順序,默認值為空。為每對節點,調用comparator函數。 comparator的默認值為空,此時采用三種遍歷順序,排序被禁用。例如,按照輸入數據的字符串名對同層節點以降序順序排序,即:
functioncomparator(a,b){
returnd3.ascending(a.name,b.name);
}
See d3.ascending or d3.descending for details.
詳見:d3.ascending或d3.descending
# cluster.separation([separation])
如果已經指定separation,使用指定的函數計算相鄰節點的間距。如果未指定separation,則返回當前間距函數。默認情況下,該函數為:
存在一個更加適合于射線布局的變動,可以根據直徑大小相應減少間距:
functionseparation(a,b){
return(a.parent==b.parent?1:2)/a.depth;
}
兩個相鄰節點a和b傳遞到separation函數,且必須返回節點間期望的間距。節點通常是同級的,雖然,這些節點也可能屬于相近關系(或更遠的關系),如果布局將這些節點臨近放置的話。
# cluster.size([size])
如果已經指定size,則將可用布局尺寸設定為指定的二元數組,以x和y來表示。如果尺寸沒有指定,則返回當前尺寸,默認值為1×1,如果nodeSize正在使用中,則默認值為空。雖然布局在x和y軸都有數值,但該坐標系可以是任意坐標系。例如,創建一個射線布局,其中樹的廣度(x)用角度來測量, 樹的深度(y)表示半徑r, 單位為像素,即 [360, r]。
# cluster.nodeSize([nodeSize])
如果nodeSize已經指定,以二元數組x和y的形式返回每個節點的固定尺寸。如果nodeSize沒有指定,則返回當前節點尺寸,默認值為空,表示布局尺寸總體固定,可以使用size來獲得。
# cluster.value([value])
如果已經指定value,則用指定的函數設定值訪問器。如果尚未指定value,則返回當前值訪問器,默認值為空,表示值屬性沒有計算。指定之后,每次輸入數據元,都會調用值訪問器,并且必須返回一個用以表示節點數值的數字。該值對集群布局沒有影響,但它是分層布局所提供的通用功能。
* 張爍譯 20140430
* 咕嚕校對 2014-11-30 10:42:08