Работа скрипку: http://jsfiddle.net/reblace/GsaGb/1
Там же несколько вопросов здесь ...
Во-первых, вы были обновляя все данные chart_data в цикле for, но вне цикла, вы пытались обновить строку, все еще сохраненную в переменной linedata после выполнения цикла. Вы должны стараться избегать наличия переменных с большим объемом, чем им нужно. Это может привести к ошибкам, как это одна:
svg.selectAll("path").data([linedata.points]);
line(linedata.points);
Вместо этого вы должны использовать данные D3 присоединения воссоединиться новые данные всех дорожек сразу декларативно, как так:
linesGroup.selectAll("path")
.data(chart_data)
.attr("d", function(d){ return line(d.points); });
Что делание, что код является он выбирает пути и затем соединяет каждый из них с элементами chart_data, а затем привязывает соответствующий генератор строк к атрибуту «d» для соответствующего пути.
Затем вам необходимо обновить ось x и ось y, иначе график будет просто снимать обратную область. Этот код обновляет домены, а затем подмены осей к элементам DOM, таким образом они перерисовывать:
xAxis.scale().domain([
d3.min(chart_data, function (c) { return d3.min(c.points, function (v) { return v.created_at; }); }),
d3.max(chart_data, function (c) { return d3.max(c.points, function (v) { return v.created_at; }); })
]);
yAxis.scale().domain([
0,
d3.max(chart_data, function (c) { return d3.max(c.points, function (v) { return v.rate; }); })
]);
svg.select(".x.axis").call(xAxis);
svg.select(".y.axis").call(yAxis);
Были несколько других ошибок я установил их в Fiddle. Например, вам нужно рассчитать время для новой точки на основе последнего элемента в массиве, а не первого, иначе линия не сможет правильно интерполировать, так как его уже не непрерывная функция ... и это немного больше лаконичный способ сделать ваши обновления строки:
for (var i=0; i<chart_data.length; i++) {
linedata = chart_data[i];
//delete first element of array
var removedPoint = linedata.points.shift();
//create a new point
var lastpoint = linedata.points[linedata.points.length-1];
var new_point = {
rate: removedPoint.rate,
created_at: lastpoint.created_at + 6000
};
linedata.points.push(new_point);
}
Также обратите внимание, что вы не должны использовать для (вар в) петлю для массивов, это итерация свойств в объекте.
Есть еще некоторые проблемы, но я думаю, что это должно помочь вам преодолеть препятствие, на которое вы застряли. В любом случае, это выглядит здорово в действии!
Отличный @reblace ... fenac должен дать вам фонтан для вас ... – sam
СПАСИБО ВАМ ТАК, очень полезно !! – fenec