D3嵌套对象应该是不同的颜色

时间:2015-03-17 00:49:30

标签: csv d3.js nested data-visualization

我正在创建一个折线图,其中线条下的区域根据变量rank进行着色,而dateclose的绘图不考虑该变量d3.nest()。我正在使用rank根据dataGroup对数据进行分块,然后循环遍历<!DOCTYPE html> <meta charset="utf-8"> <style> body { font: 12px Arial; } text.shadow { stroke: #fff; stroke-width: 2.5px; opacity: 0.9; } path { stroke: steelblue; stroke-width: 2; fill: none; } .axis path, .axis line { fill: none; stroke: grey; stroke-width: 1; shape-rendering: crispEdges; } .grid .tick { stroke: lightgrey; stroke-opacity: 0.7; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } .area { stroke-width: 0; } </style> <body> <script src="http://d3js.org/d3.v3.min.js"></script> <script> var margin = {top: 30, right: 20, bottom: 35, left: 50}, width = 600 - margin.left - margin.right, height = 270 - margin.top - margin.bottom; var parseDate = d3.time.format("%d-%b-%y").parse; var color = d3.scale.category20(); var x = d3.time.scale().range([0, width]); var y = d3.scale.linear().range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom") .ticks(5); var yAxis = d3.svg.axis() .scale(y) .orient("left") .ticks(5); var area = d3.svg.area() .x(function(d) { return x(d.date); }) .y0(height) .y1(function(d) { return y(d.close); }); var valueline = d3.svg.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.close); }); 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 + ")"); // function for the x grid lines function make_x_axis() { return d3.svg.axis() .scale(x) .orient("bottom") .ticks(5) } // function for the y grid lines function make_y_axis() { return d3.svg.axis() .scale(y) .orient("left") .ticks(5) } // Get the data d3.csv("data.csv", function(error, data) { data.forEach(function(d) { d.date = parseDate(d.date); d.close = +d.close; }); var dataGroup = d3.nest() .key(function(d) { return d.rank; }) .entries(data); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.close; })]); dataGroup.forEach(function(d, i){ svg.append("path") .datum(data) .attr("class", "area") .attr("d", area); }); svg.selectAll(".area") .style("fill",function() { return "hsl(" + Math.random() * 360 + ",100%,50%)"; }) // Draw the x Grid lines svg.append("g") .attr("class", "grid") .attr("transform", "translate(0," + height + ")") .call(make_x_axis() .tickSize(-height, 0, 0) .tickFormat("") ) // Draw the y Grid lines svg.append("g") .attr("class", "grid") .call(make_y_axis() .tickSize(-width, 0, 0) .tickFormat("") ) // Add the valueline path. svg.append("path") .attr("d", valueline(data)); // Add the X Axis svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); // Add the Y Axis svg.append("g") .attr("class", "y axis") .call(yAxis); // Add the text label for the X axis svg.append("text") .attr("transform", "translate(" + (width/2) + " ," + (height+margin.bottom) + ")") .style("text-anchor", "middle") .text("Date"); // Add the white background to the y axis label for legibility svg.append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("x", margin.top - (height / 2)) .attr("dy", ".71em") .style("text-anchor", "end") .attr("class", "shadow") .text("Price ($)"); // Add the text label for the Y axis svg.append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("x", margin.top - (height / 2)) .attr("dy", ".71em") .style("text-anchor", "end") .text("Price ($)"); // Add the title svg.append("text") .attr("x", (width / 2)) .attr("y", 0 - (margin.top / 2)) .attr("text-anchor", "middle") .style("font-size", "16px") .style("text-decoration", "underline") .text("Price vs Date Graph"); }); </script> </body> 并使用随机颜色绘制每个条目。

基于这个思维过程,每个数据组应该是不同的颜色,但是当它绘制时,我只得到整个绘图的一个随机颜色。

这是Plunker

{{1}}

1 个答案:

答案 0 :(得分:0)

将完整数据集(数据)绑定到每个区域元素。因此,所有区域都在彼此之上,填充结果只显示最顶部区域路径。 而不是在dataGroup.forEach()中,您只需要绑定对应于等级的数据:

... svg.append(&#34;路径&#34)。数据(d.values)......