Довольно неожиданно для d3.js, так что есть что-то очевидное, что мне не хватает. Смотрели этот код снова и снова, не уверен, где это происходит.Обновление графика с новыми данными
У меня есть барграф, который отображает 28 баров. Я пытаюсь:
- Реплицируйте это tutorial, где новые данные добавляются в график, а самые старые данные удаляются.
- Вместо того чтобы использовать shift для удаления данных, я хотел бы нажать на график/массив, но отображать только последние 28 чисел. Я бы хотел использовать весь массив для другого отображения. Это сказало, я не могу заставить выше работать.
Это jsFiddle для беспокойства.
У меня есть график, расположенный внутри группы (с уникальным идентификатором, # kI1data, план с несколькими графиками позже). Когда эта группа нажата, значение из массива данных сдвигается, а другое - нажато. Затем график перерисовывается. Я считаю, что эта функция перерисовки вызывает проблему; он удаляет прямоугольники, но не добавляет новых после первого щелчка.
graphGroup.append("g")
.attr("id", "kInv1")
.append("rect")
.attr("class", "invBack")
.attr("x", 0).attr("y", 0)
.attr("width", kI1width).attr("height", kI1height)
.attr("fill", "grey")
.on("click", dataChange); // Add/remove data, and update graph
function dataChange() {
kInvd1.shift();
kInvd1.push(30); // 30 a placeholder number
updateGraph();
};
function updateGraph() {
// Select the group containing the rectangles that need updating
// (to avoid selecting other rectangles within the svg)
var kI3dataSelect = d3.select("#kI1data").selectAll("rect").data(kInvd1, function(d) { return d; });
// Enter new data
kI3dataSelect.enter().append("rect")
.attr("x", function(d, i) { return 1 + ((i+1) * ((kI1width)/28)); })
.attr("y", function(d) { return ykI1(d); })
.attr("height", function(d) { return (kI1height) - ykI1(d); })
.attr("width", (kI1width)/28)
.attr("fill", "black");
// Update positions (shift one bar left)
kI3dataSelect
.transition().duration(100)
.attr("x", function(d, i) { return 1 + (i * ((kI1width)/28)); });
kI3dataSelect.exit()
.transition().duration(100)
.attr("x", function(d, i) { return 1 + ((i-1) * ((kI1width)/28)); })
.remove();
};
На данный момент я просто пытаюсь получить недавно добавленные данные для отображения, в то время как самые старые данные удаляются. Как только это будет сделано, если есть указатели на то, как отображать только последние 28 чисел в массиве, это было бы очень полезно!
jsFiddle показывает, как новый штрих добавляется при первом щелчке, но последующие клики только переводят и удаляют данные, в то время как новые бары не добавляются.
Вы не связали новые данные в своей функции updateGraph, поэтому добавьте .data (kInvd1) после enter(). Я также думаю, что вы захотите изменить строку .attr («x» ..., чтобы вы просто добавляли 1 к i. Для отображения только последних 28 записей массива вы могли либо использовать функцию фильтра d3 или вы можете использовать javascript slice для предварительной обработки ваших данных. – user1614080
Добавление .data (kInvd1) после ввода() дает ошибку. Я могу обновить var 'kI3dataSelect = d3.select (" # kI1data "). selectAll (" rect ") .data (kInvd1, function (d) {return d;}); 'для ссылки на 'kInvd1'. Любая помощь с фильтром? Если я удалю kInvd1.shift(), чтобы получить постоянно расширяющийся массив, я был в надежде 'd3.select (" # kI1data "). selectAll (" rect "). data (kInvd1) .filter (function (d, i) {return i> = (kInvd1.length - 28)});' будет работать как только массив будет больше, чем 28 записей.Если() ему не нравится, но чтение вокруг предмета подсказывает, что делать с индексом, но я боюсь ... – user969670