#javascript #csv #d3.js #reload #flicker
#javascript #csv #d3.js #перезагрузка #мерцание
Вопрос:
Я новичок в d3 и многому учусь. У меня небольшая проблема с обновлением моих данных, которые я получаю из файла csv.
Я использую setInterval() для обновления данных каждую секунду. Когда он удаляет и вставляет данные снова, он мерцает в течение нескольких миллисекунд (таблица исчезает и создается новая таблица). Что я делаю не так? Как я могу избавиться от мерцания?
Спасибо за помощь! 🙂
Вот мой код:
<script type="text/javascript">
d3.text("data.csv", function(data) {
var parsedCSV = d3.csv.parseRows(data);
var container = d3.select("body")
.append("table")
.selectAll("tr")
.data(parsedCSV).enter()
.append("tr")
.selectAll("td")
.data(function(d) { return d; }).enter()
.append("td")
.text(function(d) { return d; });
});
var inter = setInterval(function() {
updateData();
}, 1000);
function updateData() {
d3.text("data.csv", function(data) {
var parsedCSV = d3.csv.parseRows(data);
var container = d3.select("body")
.append("table")
.selectAll("tr")
.data(parsedCSV).enter()
.append("tr")
.selectAll("td")
.data(function(d) { return d; }).enter()
.append("td")
.text(function(d) { return d; });
});
d3.select("body").selectAll("tr")
.remove()
}
</script>
Ответ №1:
Добавление transition() для ввода / вывода / удаления вызовов решит вашу проблему с мерцанием.
var circleData = [50, 40, 30, 60, 70];
var svg = d3.select("body").append("svg")
.attr("width", 500)
.attr("height", 5000)
var circle = svg.append("circle")
.attr("cx", 100)
.attr("cy", 100)
.attr("r", 25);
setTimeout(function() {
updateCircles(circleData)
}, 2500)
function updateCircles(data) {
var circles = svg.selectAll("circle")
.data(circleData);
circles.enter()
.append("circle")
.attr("cx", 100)
.attr("cy", function(d, i) {
return (i 1) * 100
})
.attr("r", 0)
.attr("fill", 'yellow')
.transition()
.duration(1500)
.attr("r", function(d) {
return d;
});
circles.transition()
.duration(1500)
.delay(1500)
.style('fill', 'green')
.attr('r', function(d) {
return d;
});
circles.exit()
.transition().duration(1500).delay(1500)
.style("fill", "red")
.transition().duration(1500).delay(3000)
.attr("r", 0).transition().remove();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
Комментарии:
1. хм, не совсем работает. он должен заменить данные, не переходя к следующим: D Но все равно спасибо за ответ.
2. В вашем вопросе не указано «данные не обновляются». В вопросе говорится об эффекте мерцания. Пожалуйста, обновите вопрос должным образом
3. Данные обновляются, но с коротким мерцанием между удалением и получением новых данных
4. Если для вас проблема с мерцанием, то что не так с моим ответом? Мой ответ показывает, как вы можете смягчить переход между добавлением / удалением. Почему он отклонен?
5. Я пробовал метод transition(), и он почему-то не работает для моего кода. Если я добавлю переход к .remove() и переход к .enter(), данные больше не будут обновляться. PS: моя репутация слишком низкая, чтобы понизить ваш ответ, кто-то другой понизил его с большей репутацией. В любом случае спасибо.