使用 nest 和 rollup 在 d3 v4 中创建具有均值的折线图
Using nest and rollup to create a line chart with a mean in d3 v4
我正在尝试使用 nest 和 rollup 在 d3 v4 中创建一个折线图来显示几天的平均分数。我已经用尽了所有教程和 Whosebug 答案,无论我尝试什么,我似乎都无法显示该行。
我附上了下面的代码,如果有人能提供帮助,我将不胜感激。
// set the dimensions and margins of the graph
var margin = {top: 20, right: 20, bottom: 30, left: 50},
width = 960 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// parse the date / time
var parseTime = d3.timeParse("%d/%m");
// append the svg object to the body of the page
// appends a 'group' element to 'svg'
// moves the 'group' element to the top left margin
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 + ")");
// Get the data
d3.csv("csv/formdata.csv", function(error, data) {
if (error) throw error;
// format the data
data.forEach(function(d) {
d.date = parseTime(d.date);
d.scale = +d.scale;
});
var dataNest = d3.nest()
.key(function(d) {return d.date;})
.rollup (function(v) { return {
averagescale: d3.mean(v, function(d) {return d.scale; })
}; })
.entries(data)
console.log(dataNest)
// set the ranges
var x = d3.scaleTime().range([0, width]);
var y = d3.scaleLinear().range([height, 0]);
// define the line
var valueline = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.averagescale); });
// Scale the range of the data
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([0, d3.max(dataNest, function(d) { return d.averagescale; })]);
// Add the valueline path.
svg.append("path")
.data(dataNest)
.attr("class", "line")
.attr('d', function(d) { return valueline (d.averagescale); })
// Add the X Axis
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
// Add the Y Axis
svg.append("g")
.call(d3.axisLeft(y));
});
csv 如下所示
date,grade,scale
10/05,vs,7
10/05,vs,2
11/05,vs,3
11/05,vs,6
12/05,vs,8
12/05,vs,2
13/05,vs,3
13/05,vs,6
问题:由于你滚动 up.value 将保持 averagescale
。
y.domain([0, d3.max(dataNest, function(d) { return d.averagescale; })]);
应该是:
y.domain([0, d3.max(dataNest, function(d) { return d.value.averagescale; })]);
后续line函数也需要修改:
var valueline = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.averagescale); });
应该是:
var valueline = d3.line()
.x(function(d) { return x(new Date(d.key)); })
.y(function(d) { return y(d.value.averagescale); });
工作代码here
我正在尝试使用 nest 和 rollup 在 d3 v4 中创建一个折线图来显示几天的平均分数。我已经用尽了所有教程和 Whosebug 答案,无论我尝试什么,我似乎都无法显示该行。
我附上了下面的代码,如果有人能提供帮助,我将不胜感激。
// set the dimensions and margins of the graph
var margin = {top: 20, right: 20, bottom: 30, left: 50},
width = 960 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// parse the date / time
var parseTime = d3.timeParse("%d/%m");
// append the svg object to the body of the page
// appends a 'group' element to 'svg'
// moves the 'group' element to the top left margin
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 + ")");
// Get the data
d3.csv("csv/formdata.csv", function(error, data) {
if (error) throw error;
// format the data
data.forEach(function(d) {
d.date = parseTime(d.date);
d.scale = +d.scale;
});
var dataNest = d3.nest()
.key(function(d) {return d.date;})
.rollup (function(v) { return {
averagescale: d3.mean(v, function(d) {return d.scale; })
}; })
.entries(data)
console.log(dataNest)
// set the ranges
var x = d3.scaleTime().range([0, width]);
var y = d3.scaleLinear().range([height, 0]);
// define the line
var valueline = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.averagescale); });
// Scale the range of the data
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([0, d3.max(dataNest, function(d) { return d.averagescale; })]);
// Add the valueline path.
svg.append("path")
.data(dataNest)
.attr("class", "line")
.attr('d', function(d) { return valueline (d.averagescale); })
// Add the X Axis
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
// Add the Y Axis
svg.append("g")
.call(d3.axisLeft(y));
});
csv 如下所示
date,grade,scale
10/05,vs,7
10/05,vs,2
11/05,vs,3
11/05,vs,6
12/05,vs,8
12/05,vs,2
13/05,vs,3
13/05,vs,6
问题:由于你滚动 up.value 将保持 averagescale
。
y.domain([0, d3.max(dataNest, function(d) { return d.averagescale; })]);
应该是:
y.domain([0, d3.max(dataNest, function(d) { return d.value.averagescale; })]);
后续line函数也需要修改:
var valueline = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.averagescale); });
应该是:
var valueline = d3.line()
.x(function(d) { return x(new Date(d.key)); })
.y(function(d) { return y(d.value.averagescale); });
工作代码here