> [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
堆疊布局需要一個二維的數據數組,并計算基準線;這個基準線會被傳到上層,以便生成一個堆疊圖。支持多個基線算法,以及啟發式的排序算來可以提高感知靈敏度,就像拜倫(Byron)和瓦騰伯格(Wattenberg)在“Stacked Graphs—Geometry & Aesthetics”(http://www.leebyron.com/else/streamgraph/download.php?file=stackedgraphs_byron_wattenberg.pdf)中所說的那樣。
堆疊布局可以工作在任意的二維x,y坐標系空間,就像是D3的其他布局一樣,包括樹布局(tree)。因此,圖層可以被垂直、水平疊放,或者是其他徑向的疊放(radially)。盡管圖表的默認偏移是零,但是依然可以使用扭動或擺動(wiggle)的偏移量來繪制流圖,它會盡量的減少在偏移時所產生的鋸齒邊界。
# d3.layout.stack()
構造一個新的堆疊布局,使用默認的偏移(零)和排序(空null);返回的布局對象是一個對象也是一個函數;也就是說:你可以向調用函數一樣調用布局,布局是具備改變其行為的方法的;和D3中其他類相似,布局遵循方法鏈模式,其中setter方法返回布局本身,并允許在一個簡單語句中調用多個setter方法。
# stack(layers[, index])
為各層計算y坐標的基線,并傳到相應的層中。最簡單的情況,層是一個二維的值數組;所有的第二維的數組必須是相同的長度。y和x訪問器被用來分別定義每層的x坐標位置的y方向厚度;因此下面這些值都是必須的:
? x - x位置處所對應的值,即x坐標;
? y - y處厚度所對應的值;
? y0 - y方向最小的y值,即基線;
以上這些屬性可以通過重寫訪問器或out函數進行自定義。
# stack.values([accessor])
指定在每一層中如何從相關聯的元素中提取值,訪問器是一個函數,并被傳遞給層以被調用在每一個輸入層上,相當于是在計算堆疊布局前調用了layers.map(accessor)。默認的值函數是內置對象,類似于標識函數。如果未指定訪問器accessor,則返回當前的值訪問器。
值訪問器可以被用于關聯每層額外的數據,而不僅僅是每一個點;例如,假設你的數據結構如下:
var layers = [
{
"name": "apples",
"values": [
{ "x": 0, "y": 91},
{ "x": 1, "y": 290}
]
},
{
"name": "oranges",
"values": [
{ "x": 0, "y": 9},
{ "x": 1, "y": 49}
]
}
];
指定一個值訪問器來檢索每層的點:
var stack = d3.layout.stack()
.offset("wiggle")
.values(function(d) { return d.values; });
然后,如果你想給每層添加一個tooltip,你可以這樣寫:
svg.selectAll("path")
.data(stack(layers))
.enter().append("path")
.attr("d", function(d) { return area(d.values); })
.append("title")
.text(function(d) { return d.name; });
# stack.offset([offset])
如果指定offset,則設置堆疊的偏移算法為指定的offset ;如果未指定offset ,則返回當前的offset;以下的字符串值可以被使用:
? silhouette - 居中流,類似于 ThemeRiver;
? wiggle - 盡量減少斜率變化比例;
? expand -標準化層以填補在范圍[0,1]之間;
? zero - 使用零基線,即y軸.;
另外offset 可以是一個函數;輸入到該函數的是層數據;并已被標準化顯示:一個二維的值數組,每個元素被表示為一個二元素的數組[x,y];函數的返回值必須是一個表示基線y坐標的數組。例如,默認的零偏移實現如:
function offset(data) {
var j = -1,
m = data[0].length,
y0 = [];
while (++j < m) y0[j] = 0;
return y0;
}
# stack.order([order])
如果指定order,設置堆疊的排序為指定的order;如果未指定,則返回當前的order。以下字符串類型的值可被使用:
? inside-out - 通過最大值的索引進行排序,然后使用平衡加權;
? reverse - 反轉輸入層的次序;
? default - 使用輸入層順序;
另外order也可以是函數;輸入到該函數的是層數據,并已被標準化顯示:一個二維的值數組,每個元素被表示為一個二元素的數組[x, y];該函數的返回值必須是一個表示層順序的索引數組。例如,默認的順序實現如:
function order(data) {
return d3.range(data.length);
}
參見 d3.range.
# stack.x([accessor])
指定如何訪問每個值位置中的x坐標。如果指定accessor,則設置訪問器為指定的函數;如果未指定accessor,則返回當前綁定的訪問器函數;在默認情況下假定每個輸入值都有x屬性:
function x(d) {
return d.x;
}
X訪問器會被每一個輸入值調用,并且每一層,被傳遞的參數有當前數據(d)和數據元素索引(i);返回值必須是一個數字;雖然x訪問器會被每層調用,堆疊布局是假定所有層的x坐標是一致的;也就是說,堆疊布局目前需要每層都是均勻的,在相同的x坐標下,都必須包含相同個數的值;如果你的數據不符合這種規則,在你進行堆疊布局前需要整理好數據符合這種規則。
# stack.y([accessor])
指定如何訪問每個值位置中的y坐標。如果指定accessor,則設置訪問器為指定的函數;如果未指定accessor,則返回當前綁定的訪問器函數;在默認情況下假定每個輸入值都有y屬性:
function y(d) {
return d.y;
}
X訪問器會被每一個輸入值調用,并且每一層,被傳遞的參數有當前數據(d)和數據元素索引(i);返回值必須是一個數字;隨著異常的擴大偏移,堆疊布局不會執行任何的數據自動縮放;為了簡化縮放,可以使用關聯的線性縮放linear scale或其他類似的。
# stack.out([setter])
指定如何傳遞計算的基線給上層;如果指定setter,它將被用作該輸出/傳遞功能上;如果未指定setter,則返回當前的setter;默認情況下假定每個輸入值都有y和y0屬性:
function out(d, y0, y) {
d.y0 = y0;
d.y = y;
}
setter會被每一個輸入值調用,并且每一層,被傳遞的參數有當前數據(d),已計算的y0值和已計算的y厚度;在除了expand偏移的所有情況下,y厚度是相同于y的返回值,因此可被忽略。
* 魏飛譯 2014.07.08.10.04
* gulu 校對 2014-12-6 23:08:08