Подтвердить что ты не робот

Как рассчитать значение y для данного x, используя d3.js

Я определил линейный генератор с d3.js следующим образом:

var line = d3.svg.line()
    .interpolate("monotone")
    .x(function(d) {return x(d.date); })
    .y(function(d) {return y0(d.visits); });

Данные считываются из csv со следующим форматом:

date,visits
12/08/12,1
13/08/12,0
14/08/12,0
15/08/12,33
16/08/12,28

Файл csv загружается в data и анализируется как:

data.forEach(function(d) {
    d.date = d3.time.format("%d/%m/%y").parse(d.date);
    d.visits = +d.visits;
});

и добавлен в документ с помощью:

svg.append("path")
    .datum(data)
    .attr("class", "line")
    .attr("d", line)

В другом месте в моем script мне нужно выяснить, какое значение y находится в конкретную дату. Так, например, мне может понадобиться получить значение y для строки, где дата 15/08/12 (эквивалентна y0(33)). Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать bisect, чтобы найти дату в своем массиве, а затем вызвать функцию y0. Код выглядел бы примерно так (взятый почти полностью из документации):

var bisect = d3.bisector(function(d) { return d.date; }).right;
...   
var item = data[bisect(data, new Date(2012, 8, 15))];
y0(item.visits);

Обратите внимание: этот подход требует, чтобы ваши даты сортировались, что они находятся в ваших данных примера.

Ответ 2

Edit

Чтобы отвлечься от примера Ларса, с небольшой настройкой, чтобы избежать -1 хаков:

var bisect = d3.bisector(function(d) { return d.date; }).left;
...   
var item = data[bisect(data, new Date(2012, 8, 15))];
y0(item.visits);

Оригинальная публикация

rudivonstaden, вы можете использовать функцию .left, прикрепленную к биссектре, вместо примера .right в примере Lars - таким образом вам не нужно делать -1 взломанный вами файл.