2016-12-29 62 views
1

數據我下面這個例子爲multi-line graphD3正從多列CSV

我想用值2010年以來,2011年繪製的每個預測在我的CSV,2012年

forecast.csv

forecast,2010,2011,2012 
Outlook,87,88,88 
Reform,50,20,88 
Renewal,43,21,88 

如果我的數據是簡單的像例子中的鏈接,建立圖表的代碼是這樣的:

var priceline = d3.svg.line() 
    .x(function(d) { return x(d.year); }) 
    .y(function(d) { return y(d.value); }); 

var dataNest = d3.nest() 
    .key(function(d) {return d.forecast;}) 
    .entries(data); 

dataNest.forEach(function(d) { 

    svg.append("path") 
     .attr("class", "line") 
     .attr("d", priceline(d.values)); 

      console.log(dataNest) 
}); 

但是我的數據來自多列CSV。

我試圖嵌套預測,所以每個預測都會有一個年份和值對的數組。即

[0] Object 
     [key] Outlook 
     [values] 
     [0] year: 2010 
      value: 28 
     [1] year: 2011 
      value: 88 

但dataNest目前看起來是這樣的

[0] Object 
     [key] Outlook 
     [values] 
     [0] 2010: 87 
      2011: 88 
      2012: 88 

還有許多其他年份的實際數據,因此變調是不是一種選擇。如何從此多列CSV數據中繪製一條線?

+0

你有沒有想過關於首先對數據進行融合,以便第二列的年份和第三列的相應數值? – Terry

+0

是的,但是我的數據太大 - 每個預測都有30多年。我可以用d3做這個,還是我需要學習在R中做這個例子? – user3821345

+0

如果數據是靜態的,您可以簡單地對年份值進行一次硬編碼,使用'd3.csv()'遍歷CSV文件,然後將每年推入一個對象數組中? – Terry

回答

0

您可以更改數據格式或修改d3.nest函數。然而,我認爲最簡單的方法是使用普通的JavaScript修改陣列:

dataNest.forEach(function(d) { 
    d.values.forEach(function(e) { 
     var myArr = []; 
     for (var key in e) { 
      if (e[key] != d.key) { 
       myArr.push({ 
        "year": key, 
        "value": e[key] 
       }); 
      } 
     } 
     d.values = myArr; 
    }) 
}) 

這裏是一個演示,在你的問題使用數據:

var data = d3.csv.parse(d3.select("#csv").text()); 
 

 
var dataNest = d3.nest() 
 
    .key(function(d) { 
 
     return d.forecast; 
 
    }) 
 
    .entries(data); 
 

 
dataNest.forEach(function(d) { 
 
    d.values.forEach(function(e) { 
 
     var myArr = []; 
 
     for (var key in e) { 
 
      if (e[key] != d.key) { 
 
       myArr.push({ 
 
        "year": key, 
 
        "value": e[key] 
 
       }); 
 
      } 
 
     } 
 
     d.values = myArr; 
 
    }) 
 
}) 
 

 
console.log(dataNest)
pre { 
 
    display: none; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<pre id="csv">forecast,2010,2011,2012 
 
Outlook,87,88,88 
 
Reform,50,20,88 
 
Renewal,43,21,88</pre>

+0

非常感謝!我應該如何找到嵌套值的x和y域?例如:x.domain(d3.extent(dataNest,function(d){return d.year;})); – user3821345