javascript - D3条形图不解析csv

标签 javascript parsing csv d3.js

我正在尝试使用从 CSV 加载的数据构建一个基本的响应式条形图。我的图表未读取 CSV,并给出 NaN。 Here's a screenshot of what my chart looks like.这是我当前的代码:

  <script type="text/javascript">
var url = "data/data.csv", 
    margin = {top: 30, right: 10, bottom: 30, left: 10},
    width = parseInt(d3.select('#chart').style('width'), 10),
    width = width - margin.left - margin.right,
    height = 200, // placeholder
    barHeight = 20,
    spacing = 5,
    total = d3.format('n');

// scales and axes
var x = d3.scale.linear()
    .range([0, width])
    .domain([0, 4000]); // hard-coding this because I know the data

var y = d3.scale.ordinal();

var xAxis = d3.svg.axis()
    .scale(x)
    .ticks(3);

// create the chart
var chart = d3.select('#chart').append('svg')
    .style('width', (width + margin.left + margin.right) + 'px')
  .append('g')
    .attr('transform', 'translate(' + [margin.left, margin.top] + ')');

d3.csv(url).row(function(d) {
    d.total = +d.total;
    d.name = +d.name;

    return d;
}).get(function(err, data) {
    // sort
    data = _.sortBy(data, 'total').reverse();

    // set y domain
    y.domain(d3.range(data.length))
        .rangeBands([0, data.length * barHeight]);

    // set height based on data
    height = y.rangeExtent()[1];
    d3.select(chart.node().parentNode)
        .style('height', (height + margin.top + margin.bottom) + 'px')

    // render the chart

    // add top and bottom axes
    chart.append('g')
        .attr('class', 'x axis top')
        .call(xAxis.orient('top'));

    chart.append('g')
        .attr('class', 'x axis bottom')
        .attr('transform', 'translate(0,' + height + ')')
        .call(xAxis.orient('bottom'));

    var bars = chart.selectAll('.bar')
        .data(data)
      .enter().append('g')
        .attr('class', 'bar')
        .attr('transform', function(d, i) { return 'translate(0,'  + y(i) + ')'; });

    bars.append('rect')
        .attr('class', 'background')
        .attr('height', y.rangeBand())
        .attr('width', width);

    bars.append('rect')
        .attr('class', 'total')
        .attr('height', y.rangeBand())
        .attr('width', function(d) { return x(d.total); })

    bars.append('text')
        .text(function(d) { return d.name; })
        .attr('class', 'name')
        .attr('y', y.rangeBand() - 5)
        .attr('x', spacing);


    bars.append('line')
        .attr('class', 'median')
        .attr('x1', x(median))
        .attr('x2', x(median))
        .attr('y1', 1)
        .attr('y2', y.rangeBand() - 1);
});

// resize
d3.select(window).on('resize', resize); 

function resize() {
    // update width
    width = parseInt(d3.select('#chart').style('width'), 10);
    width = width - margin.left - margin.right;

    // resize the chart
    x.range([0, width]);
    d3.select(chart.node().parentNode)
        .style('height', (y.rangeExtent()[1] + margin.top + margin.bottom) + 'px')
        .style('width', (width + margin.left + margin.right) + 'px');

    chart.selectAll('rect.background')
        .attr('width', width);

    chart.selectAll('rect.total')
        .attr('width', function(d) { return x(d.total); });

    // update axes
    chart.select('.x.axis.top').call(xAxis.orient('top'));
    chart.select('.x.axis.bottom').call(xAxis.orient('bottom'));

}

// highlight code blocks
hljs.initHighlighting();

</script>

这是数据:

name, total
Brian, 1514
Frankie, 1439
Jeffery, 1615
Jerry, 685
Kenneth, 3233
Michael, 116
Roy, 817
Timothy, 2184

最佳答案

我发现您的代码和数据存在一些问题:

对于数据问题,您可以通过删除空格来清理行,例如:

name,total
Brian,1514
Frankie,1439
Jeffery,1615
Jerry,685
Kenneth,3233
Michael,116
Roy,817
Timothy,2184

或者您可以使用 [] 符号在代码中引用它们,例如:

d[' total'] = +d[' total'];

d3 正在为每条记录的属性名称添加前导空格。当您将属性引用为 d.total 时,它会返回 undefined 并且 undefined 被强制转换为 NaN。

例如。 data[0]['total'] 未定义,但 data[0]['total'] 正如您所期望的那样具有“1514”。从数据中删除空格是处理此问题的最简单方法。

在您的代码中,您正在执行以下操作:

d.name = +d.name;

这会将名称值转换为 NaN,因为它是一个以字母字符开头的文本字符串,因此 JavaScript 不知道如何将其强制转换为数字。

您还引用了一个名为median 的变量,该变量未在代码中声明。

我创建了一个 jsfiddle 来帮助:http://jsfiddle.net/BenLyall/eh1r6j2e/12/

注意:我已更改 d3.csv... 行以使用 DOM 中的元素来存储数据。

关于javascript - D3条形图不解析csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25778666/

相关文章:

JavaScript getElementById(...) 为 null 或不是对象 IE

android - 使用 SAX 解析递归 XML

.net - 日期/时间加法/减法和变量是否有标准语法?

java - 如何从 CSV 文件获取数据并将其放入列表中

angularjs - 使用 Angularjs 将 Excel 转换为 JSON

csv - Pig 使用 PigStorage 加载 map (',' )

javascript - 脚本 IF ELSE 仅处理 php 中的第一个数据

javascript - 使用 Chrome 扩展程序在页面加载时重定向

javascript - 将页脚粘贴到页面底部

objective-c - 在窗口 IB 上显示 NSArray