2012-06-28 95 views
7

我正在使用D3.js,並且無法爲多個系列的區域圖表設置堆疊佈局。我有兩種可能的數據結構(如果有幫助的話)。一個是供給到腳本的原始數據,在該結構中:D3.js中的堆積區域

var data = [{key: 'Group1', value: 37, date: '04/23/12'}, 
      {key: 'Group2', value: 12, date: '04/23/12'}, 
      {key: 'Group3', value: 46, date: '04/23/12'}, 
      {key: 'Group1', value: 32, date: '04/24/12'}, 
      {key: 'Group2', value: 19, date: '04/24/12'}, 
      {key: 'Group3', value: 42, date: '04/24/12'}, 
      {key: 'Group1', value: 45, date: '04/25/12'}, 
      {key: 'Group2', value: 16, date: '04/25/12'}, 
      {key: 'Group3', value: 44, date: '04/25/12'}, 
      {key: 'Group1', value: 24, date: '04/26/12'}, 
      {key: 'Group2', value: 52, date: '04/26/12'}, 
      {key: 'Group3', value: 64, date: '04/26/12'}] 

其次是嵌套結構,使用該代碼創建的:

pData = d3.nest() 
      .key(function(d) { return d.key; }) 
      .map(data); 

在該結構中所得到的:

pData = {Group1: [{date: 04/23/12, key: "Group1", value: 37}, 
        {date: 04/24/12, key: "Group1", value: 32}, 
        {date: 04/25/12, key: "Group1", value: 45}, 
        ...], 
     Group2: [{date: 04/23/12, key: "Group2", value: 12}, 
        {etc, etc, etc}], 
     GroupX: [...] } 

我的問題是:我如何設置一個d3.layout.stack()生成器,使用上述數據結構之一(或一些變化)來創建堆疊str ucture我的數據,我可以將它傳遞給類似這樣的區域生成:

var areaGenerator = d3.svg.area() 
    .interpolate('monotone') 
    .x(function(d) { return x(d.date); }) 
    .y0(h) 
    .y1(function(d) { return y(d.value); }); 

回答

12

你必須養活層的陣列的棧佈局,所以要改變的第一件事就是用nest.entries而非nest.map 。這將返回一個包含key字段(例如「Group1」)的對象數組和一個包含關聯記錄的values數組。然後,您將指定一個stack.values訪問器,以便堆棧佈局可以訪問各層的values陣列。

您還需要定義適合Xÿ存取堆棧佈局,以便它可以瞭解你的輸入數據:X -accessor應該返回d.dateÿ -accessor應返回d.value。您還需要將日期字符串轉換爲日期;你可以使用d3.time.format來解決這個問題。例如:

var format = d3.time.format("%m/%d/%y"); 
data.forEach(function(d) { d.date = format.parse(d.date); }); 

最後,使基線Y0定義爲y(d.y0)和背線Y1被定義爲y(d.y0 + d.y)改變你的區域定義。

這裏有一個工作示例:

+1

難以置信的幫助。感謝您的迴應! – mbeasley

+0

非常有幫助,謝謝! 值得指出的Javascript noobs(像我!),在d.value(在數據回調)之前的+轉換爲數字 - 請參閱[這裏](http://xkr.us/articles/javascript/unary -加/)。 在回調中,y0值如何分配?我用[this](http://pastebin.com/amjkBRYV)代碼來檢查,並得到[this](http://i.imgur.com/lQFyJNL.png)輸出。 每個對象都被記錄了兩次 - 編輯前後。之前,它只包含來自csv的數據 - 之後,它具有「y0 = 0」,正如我設置的那樣,但是(在Chrome中鑽取時)也是y和非零y0。那裏發生了什麼? – scubbo

+0

(作爲參考,我試圖操縱y0值,以便圖形顯示累計總數,而不是每個點的值) 對不起,如果您對我之前的編輯有多個通知 - 不是用於StackOverflow樣式,錯誤! – scubbo