> [Wiki](Home) ? [[API--中文手冊]] ? [[布局]] ? **樹布局**
* guluT20141102
* 如發現翻譯不當或有其他問題可以通過以下方式聯系譯者:
* 郵箱: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.layout.tree返回的是一個對象也是一個函數。也就是說:你可以像調用其他函數一樣調用布局,并且這個布局函數有可以改變它的行為的附加方法。像D3里的其他類一樣,布局遵循函數的鏈式模式,其中setter返回布局本身,允許在簡單的語句中調用多個setter方法。
# d3.layout.tree()
用默認設置創建一個樹布局:默認的排序是null;默認的孩子訪問器假定每個輸入數據是一個帶有孩子數組的對象;默認的操作函數為兄弟節點指定一個結點的寬度,沒有兄弟姐妹的節點指定兩個結點的寬度;默認的尺寸是1X1。
# tree(root)
# tree.nodes(root)
運行樹布局,返回一個與特殊的根結點root 有關系的結點數組。樹布局是D3的層次布局家族中的一部分。這些布局遵循相似的基本結構:布局的輸入參數是層次結構的根節點,輸出返回值是一個經過計算的全部結點的位置的數組。
在每個結點中包含下面幾個屬性:
?雙親-雙親結點,根節點無雙親。
?孩子-孩子結點的數組,葉子無孩子結點。
?深度-結點的深度,根節點深度為0。
?x-計算結點位置的x坐標。
?y-計算結點位置的y坐標。
盡管布局在x和y方向上有大小,這表示了一個任意的坐標系統;例如,你可以將x看做半徑,將y看做角度去產生一個徑向而不是笛卡爾布局。
# tree.links(nodes)
給定一個特殊的結點數組nodes,比如通過nodes返回的,返回一個表示從雙親結點到每個孩子結點的對象數組。葉子結點將不再有任何鏈接,每個鏈接是一個有兩個屬性的對象:
?源結點-雙親結點(如上文描述)
?目標結點-孩子結點
這種方法是有用的,用于檢索一組適合于顯示的鏈接描述,經常與對角線形狀發生器一起使用。例如:
svg.selectAll("path")
.data(tree.links(nodes))
.enter().append("path")
.attr("d", d3.svg.diagonal());
# tree.children([children])
如果指定了子節點children ,設置指定的子節點訪問器函數。如果未指定子節點,返回當前子節點訪問器函數,默認情況下假定輸入數據是一個帶有子節點數組的對象:
function children(d) {
return d.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}
]
}
]
}
]
}
子節點的訪問器首先在層次結構的根節點調用。如果訪問器返回null,則該節點在布局遍歷終止被認為是葉節點。否則,訪問器應返回表示子節點數據元素的數組。
# tree.separation([separation])
如果指定分割separation ,使用指定的函數計算兩個相鄰節點之間的分割。如果,沒有指定分割,返回當前的分割函數,默認為:
function separation(a, b) {
return a.parent == b.parent ? 1 : 2;
}
變量更適合徑向布局按比例減少半徑之間的分割間隙:
function separation(a, b) {
return (a.parent == b.parent ? 1 : 2) / a.depth;
}
分割函數傳入兩個相鄰節點a和b,必須返回節點之間期望的分割。如果布局決定放置這些相鄰節點,節點通常是兄弟節點,即使節點可能是表兄弟(甚至更遙遠的關系)。
# tree.size([size])
如果指定尺寸size ,設置可用的布局尺寸為給指定的代表x和y兩個元素的數組。如果沒有指定的,返回當前的尺寸,默認是1x1。布局尺寸可能指定為x和y,但是并不限定屏幕坐標系和其他任意的坐標系統。例如,產生一個徑向布局,其中breadth (x)以度為單位,depth (y)以像素為單位的半徑r,例如[360,r]。
樹的尺寸是tree.nodeSize特有的屬性;設定tree.size設置tree.nodeSize為null。
# tree.nodeSize([nodeSize])
如果指定了nodeSize,則為每個節點設置一個固定大小為代表x和y的兩元素數組。如果沒有指定的,則返回當前結點的尺寸,其中缺省為null表示該布局是使用整體tree.size屬性,而不是使用固定的節點大小。布局尺寸用x和y指定,但是并不受限于屏幕坐標系和其他坐標系統。
nodeSize的屬性是tree.size特有的;設定tree.size設置tree.nodeSize為null。
# tree.sort([comparator])
如果指定比較器comparator,用指定的比較器來為布局的同級節點設置排序。如果比較器沒有被指定,則返回當前組的排序,默認為空即不排序。比較函數被節點對直接調用,傳入輸入數據的每一個結點。默認的比較器是空,沒有排序和者用樹的遍歷命令。例如,通過傳遞數據的數值來進行降序排列:
function comparator(a, b) {
return b.value - a.value;
}
通過結點名或者關鍵字進行排序也是很普遍的。這可以用d3.ascending和d3.descending可以很容易實現。
# tree.value([value])
如果值是指定的,則使用指定的函數來設置值訪問器。如果值沒有指定,則返回默認為空的當前值訪問器,意思是這個值的屬性不能被計算。如果指定,值訪問器被每一個輸入的數據元素調用,一定能返回一個表示結點值的數字。這個值對于布局來說是沒有意義的,但是是層次布局提供的通用函數。
* 阿呆不呆20141128
* gulu校對2014-12-7 10:20:53