将 d3.csv 方法转换为 d3.csv.parse 方法

Posted

技术标签:

【中文标题】将 d3.csv 方法转换为 d3.csv.parse 方法【英文标题】:converting a d3.csv method to d3.csv.parse method 【发布时间】:2014-11-24 12:40:28 【问题描述】:

我只需要绘制从 sql 查询中检索到的数据的 d3 条形图,因此我没有 tsv 或 csv 文件,而是 csv 格式的数据字符串。我知道我可以使用 d3.csv.parse 方法,但不知何故,我无法弄清楚如何使用文件中的数据将 csv 条形图的示例代码转换为字符串变量中包含的数据的 csv.parse 方法。

这里是 csv 文件的示例代码:

d3.csv("data.csv", type, function(error, data) 
  x.domain(data.map(function(d)   return d.letter; ));
  y.domain([0, d3.max(data, function(d)  return d.frequency; )]);

这是用于测试目的的示例数据和不起作用的代码

var bardata="letter,frequency\nA,0.89\nB,0.71\nC,0.45";
d3.csv.parse(bardata,type, function(data)  
    x.domain(data.map(function(d)  return d.letter; )); 
    y.domain([0, d3.max(data, function(d)  return d.frequency; )]);

显然,我不能简单地将文件替换为包含文件内容的 var。最好的方法是什么?

非常感谢

【问题讨论】:

【参考方案1】:

d3.csv.parse 只接受两个参数——一个包含 CSV 数据的字符串,以及一个可用于构造数据数组的访问器函数。注意d3.csvd3.tsv之间的区别,它们都接受回调函数作为参数。

letters = d3.csv.parse(bardata, function(d) 
    return 
        letter:d.letter, 
        frequency:+d.frequency
    ;
);

这将解析bardata 中的CSV 数据并将值作为数组放入letters。实际上,访问器功能是可选的。以下也将做同样的事情:

letters = d3.csv.parse(bardata);

一旦你有了数组,你就可以像往常一样构建条形图了。请参阅下面的 sn-p。

var bardata="letter,frequency\nA,0.89\nB,0.71\nC,0.45";

var margin = top: 20, right: 30, bottom: 30, left: 40,
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1, .2);

var y = d3.scale.linear()
    .range([height, 0]);

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

letters = d3.csv.parse(bardata, function(d)  
    return 
        letter:d.letter, 
        frequency:+d.frequency
    ; 
);

x.domain(letters.map(function(d)  return d.letter; ));
y.domain([0, d3.max(letters, function(d)  return d.frequency; )]);

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.svg.axis().scale(x).orient("bottom"));

svg.append("g")
    .attr("class", "y axis")
    .call(d3.svg.axis().scale(y).orient("left"));

svg.selectAll(".bar")
    .data(letters)
  .enter().append("rect")
    .attr("class", "bar")
    .attr("x", function(d)  return x(d.letter); )
    .attr("width", x.rangeBand())
    .attr("y", function(d)  return y(d.frequency); )
    .attr("height", function(d)  return height - y(d.frequency); );
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.0.4/d3.min.js"></script>

【讨论】:

以上是关于将 d3.csv 方法转换为 d3.csv.parse 方法的主要内容,如果未能解决你的问题,请参考以下文章

fetch 未在 D3 csv 调用中定义

d3 csv数据加载

d3.csv无法上传一个目录

如何在 D3 v5 中从 CSV 文件加载数据

使用 Force Layout 从两个不同的 csv 文件中读取节点和边

为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?