javascript - 如何组织/嵌套 d3.js 图表输出的数据

标签 javascript csv d3.js nested hierarchical-data

我正在寻找一些有关如何通过 d3.js 有效使用大量数据的建议。举例来说,我有一个从原始 .csv 文件(从 Excel 转换而来)中获取的数据集;

EA
,Jan_2016,Feb_2016,Mar_2016
Netherlands,11.7999,15.0526,13.2411
Belgium,25.7713,24.1374
France,27.6033,23.6186,20.2142

EB
,Jan_2016,Feb_2016,Mar_2016
Netherlands,1.9024,2.9456,4.0728
Belgium,-,6.5699,7.8894
France,5.3284,4.8213,1.471

EC
,Jan_2016,Feb_2016,Mar_2016
Netherlands,3.1499,3.1139,3.3284
Belgium,3.0781,4.8349,5.1596
France,16.3458,12.6975,11.6196

使用 csv 我想表示这些数据的最佳方式是这样的;

Org,Country,Month,Score
EA,Netherlands,Jan,11.7999
EA,Belgium,Jan,27.6033
EA,France,Jan,20.2142
EA,Netherlands,Feb,15.0526
EA,Belgium,Feb,25.9374
EA,France,Feb,23.6186
EA,Netherlands,Mar,13.2411
EA,Belgium,Mar,24.1374
EA,France,Mar,20.2142

这对我来说似乎很冗长,并且会占用很多时间。我想知道是否有更简单的方法来做到这一点?

据我所知,我认为 JSON 可能是更合理的选择?

对于这些数据将进入哪种图表的背景,我希望创建一个饼图,它可以根据所选的国家/月份更新数据,并每次比较三个组织的分数。

(plnk 可视化) http://plnkr.co/edit/P3loEGu4jMRpsvTOgCMM?p=preview

谢谢你的建议,我有点迷失了。

最佳答案

我想说,您提出的中间步骤对于将所有内容都组织在内存中来说是一个很好的步骤。不过,您不必浏览 csv 文件,只需加载原始 csv 文件并将其转换为对象数组即可。这是一个解析器:

d3.text("data.csv", function(error, dataTxt) { //import data file as text first
 var dataCsv=d3.csv.parseRows(dataTxt); //parseRows gives a 2D array
 var group=""; // the current group header ("organization")
 var times=[]; //the current month headers
 var data=[];  //the final data object, will be filled up progressively
 for (var i=0;i<dataCsv.length;i++) {
    if (dataCsv[i].length==1 ) { //group name
       if ( dataCsv[i][0] == "") 
          i++; //remove empty line
       group = dataCsv[i][0]; //get group name
       i++;
       times = dataCsv[i];//get list of time headings for this group 
       times.shift(); // (shift out first empty element)
     } else {
       country=dataCsv[i].shift(); //regular row: get country name
       dataCsv[i].forEach(function(x,j){ //enumerate values
         data.push({ //create new data item
           Org: group,  
           Country: country,
           Month: times[j],
           Score: x
         })
       }) 
    }
 }

这给出了以下数据数组:

data= [{"Org":"EA","Country":"Netherlands","Month":"Jan_2016","Score":"11.7999"},
       {"Org":"EA","Country":"Netherlands","Month":"Feb_2016","Score":"15.0526"}, ...]

在我看来,这是您可以拥有的最通用的结构。但对于内存使用来说并不是最好的。

嵌套的简单方法如下:

d3.nest()
  .key(function(d) { return d.Month+"-"+d.Country; })
  .map(data);

它将提供一个带有键值的 map ,例如:

"Jan_2016-Netherlands":[{"Org":"EA","Country":"Netherlands","Month":"Jan_2016","Score":"11.7999"},{"Org":"EB","Country":"Netherlands","Month":"Jan_2016","Score":"1.9024"},{"Org":"EC","Country":"Netherlands","Month":"Jan_2016","Score":"3.1499"}]

使用 entries 而不是 map 来使用数组而不是 map ,如果要简化数据,请使用 rollup 函数仅保留分数数组。此时将其插入任何 d3 绘图工具是相当简单的。

PS:一个Plunker以及该脚本的运行代码。一切都显示在控制台中。

关于javascript - 如何组织/嵌套 d3.js 图表输出的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273706/

相关文章:

javascript - d3.js 条形图转换无法正常工作

javascript - 打印 SSRS 报告时出错

Javascript 内嵌隐藏在 href 属性中

javascript - 如果语句无法访问 body 元素,则设置路径点

python - _sre.SRE_Pattern 对象在与另一个对象连接时不可调用

vb.net - CSV 中的换行符

javascript - 如何根据键盘输入使圆圈消失?

javascript - for循环中的AJAX问题: How can i make an ajax call on each element of an array?

python csv模块错误

javascript - 如何使用 D3.js 强制布局生成具有边权重的网络图