d3 мерцающий текст в setInterval при обновлении данных из csv

#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: моя репутация слишком низкая, чтобы понизить ваш ответ, кто-то другой понизил его с большей репутацией. В любом случае спасибо.