Использование раскладки и свертки для создания линейной диаграммы со средним значением в d3 v4

Я пытаюсь использовать гнездо и свертку, чтобы создать линейную диаграмму в d3 v4 для отображения среднего балла за несколько дней. Я исчерпал все руководства и ответы на stackoverflow, и, что бы я ни пытался, мне кажется, что строка не отображается.

Я приложил приведенный ниже код и был бы чрезвычайно признателен, если бы кто-нибудь мог помочь.

// 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


person d3giddy    schedule 19.09.2017    source источник
comment
Ваша линейная функция ожидает двух значений, а не одного. Можете ли вы добавить дату к значениям в гнезде? Иметь только ключ - это испортит линейную функцию.   -  person Ryan Morton    schedule 20.09.2017


Ответы (1)


Проблема: поскольку вы свернули .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; })]);

Впоследствии функцию линии также нужно будет изменить:

 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); });

рабочий код здесь

person Cyril Cherian    schedule 20.09.2017
comment
Отлично. Большое спасибо за то, что нашли время сделать это. Я знал, что это как-то связано с y и линией значений, но просто не мог с этим разобраться. - person d3giddy; 20.09.2017