2014-01-24 95 views
4

我有一個非常大的csv文件,可以用D3.js進行可視化。其中一個數據字段是一個時間戳,因此(而不是一次顯示所有這些信息)我想在與時間戳成比例的延遲之後創建一個svg元素(基於其他數據字段),然後將它淡出三個秒。由於數據的大小,即使它們不可見,我也無法預先創建所有元素;每個元素應該只存在三秒鐘。期望的效果是一堆點出現然後消失。D3:延遲後添加元素,然後轉換

我的最佳嘗試如下。策略是使用兩個轉換:一個延遲,然後是淡入淡出轉換。它似乎並不奏效,而是一次創造出所有的元素(儘管如此,衰落也是如此)。既然問這個問題

d3.csv(datafile).get(function(error, rows) { 
     for (var i = rows.length; i--;){ 
       var d = rows[i]; 
       plot.select("foo") // empty selection 
        .transition() 
        .delay(/*expression with d.timestamp*/) 
        .call(function(){ 
         plot.append("circle") 
          .attr(/*several, snip */) 
          .style("opacity", 1) 
          .transition() 
          .duration(3000) 
          .style("opacity", 0) 
          .remove() 
        }); 
     } 

    }); 

編輯2015年4月已經學到了很多東西,很明顯的一點似乎是與0不透明立即插入一切。然後創建一個持續時間0,可變延遲轉換以捕捉到1不透明度,然後從那裏淡出。也可以使用嵌套選擇來避免顯式的for循環。我還沒有嘗試過,但它應該工作。

回答

3

您是否嘗試過使用setTimeout?

 rows.forEach(function(d, i){ 
      setTimeout(function(){ 
        plot.append("circle") 
         .attr(/*several, snip */) 
         .style("opacity", 1) 
         .transition() 
         .duration(3000) 
         .style("opacity", 0) 
         .remove() 
      }, /*expression with d.timestamp*/); 
     }) 
+0

不怕。在for循環中運行時,重置'd'可以閉合回調的閉包。無法想到解決方法,但可能有一個。 – mgold

+1

你必須將所有東西包裝在一個函數中來創建一個新的範圍。我已經提交了一個編輯來解決你的問題。 – mgold

+0

對不起,編輯後的版本有效嗎? –