2013-07-19 29 views
1

我想从ID为“csvdata”元素在我的条形图导入数据,而不是加载它在传统的方式从外部的.csv文件,这次只是为了测试...从id,D3.js csv数据,正确的方式?

我做了一个“”元素,如上面提到的给了他的ID,脚本的 变化的部分,我加载它看起来像这样

d3.csv("data.csv", function(error, data)..... 

这个

外部CSV数据
d3.csv("#csvdata", function(error, data)..... 

和d3 sucsessfuly加载的d3文件,但不以正确的方式显示数据......在我看来,我需要一些排序转换或数据解析,我不太确定,所以我需要你的帮助...

你可以看到我目前的情况在这里:http://jsfiddle.net/dzorz/r26b9/

这里是HTML代码:

<pre id="csvdata" style="display:none"> 
Year,Outcome,Income,+5% 
2013,52083,85640,42153 
2014,60000,90000,50000 
2015,7000,100000,260000 
2016,8000,110000,270000 
2017,9000,120000,280000 
2018,10000,130000,290000 
2019,11000,140000,300000 
2020,12000,150000,310000 
2021,13000,160000,320000 
2022,310504,552339,259034 
2023,310504,552339,259034 
</pre> 

脚本:

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

var x = d3.scale.ordinal() 
    .rangeRoundBands([0, 500], .3); 

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

var color = d3.scale.ordinal() 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); 

var xAxis = d3.svg.axis() 
    .scale(x) 
    .orient("bottom"); 

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .tickFormat(d3.format(".2s")); 

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 + ")"); 

d3.csv("#csvdata", function(error, data) { 
    color.domain(d3.keys(data[0]).filter(function(key) { return key !== "Year"; })); 

    data.forEach(function(d) { 
    var y0 = 0; 
    d.ages = color.domain().map(function(name) { return {name: name, y0: y0, y1: y0 += +d[name]}; }); 
    d.total = d.ages[d.ages.length - 1].y1; 
    }); 

    data.sort(function(a, b) { return a.total - b.total; }); 

    x.domain(data.map(function(d) { return d.Year; })); 
    y.domain([0, d3.max(data, function(d) { return d.total; })]); 

    svg.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + height + ")") 
     .call(xAxis); 

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Total"); 

    var year = svg.selectAll(".year") 
     .data(data) 
    .enter().append("g") 
     .attr("class", "g") 
     .attr("transform", function(d) { return "translate(" + x(d.Year) + ",0)"; }); 

    year.selectAll("rect") 
     .data(function(d) { return d.ages; }) 
    .enter().append("rect") 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.y1); }) 
     .attr("height", 0) 
    .transition() 
     .duration(1000) 
     .attr("height", function(d) { return y(d.y0) - y(d.y1); }) 
     .style("fill", function(d) { return color(d.name); }); 

    var legend = svg.selectAll(".legend") 
     .data(color.domain().slice().reverse()) 
    .enter().append("g") 
     .attr("class", "legend") 
     .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); 

    legend.append("rect") 
     .attr("x", width - 18) 
     .attr("width", 18) 
     .attr("height", 18) 
     .style("fill", color); 

    legend.append("text") 
     .attr("x", width - 24) 
     .attr("y", 9) 
     .attr("dy", ".35em") 
     .style("text-anchor", "end") 
     .text(function(d) { return d; }); 

}); 

和CSS样式:

body { 
    font: 10px sans-serif; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: #000; 
    shape-rendering: crispEdges; 
} 

.bar { 
    fill: steelblue; 
} 

.x.axis path { 
    display: none; 
} 

你可以自由地修改我的jsfiddle上面链接,任何帮助或建议,欢迎

回答

0

当您使用d3.csv这样,它解析HTML文档 - 可以不提供这样的CSV数据。您需要以可直接在Javascript中解析的方式提供数据。最简单的方法是直接提供Javascript变量。 d3.csv实际上只是用于加载外部CSv文件,虽然您可以使用底层函数直接解析CSV,但这将是一个不太微不足道的修改。