2013-06-28 22 views
0

使用Cubism.js石墨作爲其數據源我剛開始的我面對了以下問題:不要畫空指標

當我問立體派發現所有符合特定模式的指標「findMetrics 「它可以正確找到所有指標,但我希望它只繪製實際包含數據點的指標(忽略所有指標爲空)。

我建立了一個簡化的版本來說明問題:

<meta charset="utf-8" /> 
<style>@import url(//square.github.com/cubism/style.css);</style> 
<div id="body"> 
<div id="graphs"></div> 

<script src="http://d3js.org/d3.v2.js" charset="utf-8"></script> 
<script src="http://square.github.com/cubism/cubism.v1.js" charset="utf-8"></script> 
<script> 
    var context = cubism.context().serverDelay(5 * 60 * 1000).step(60 * 1000); 
    var graphite = context.graphite("http://graphite-server"); 
    // Graphite search metric pattern. In my case this it returns 4 metrics 
    var findMetrics = 'carbon.agents.*.{errors,committedPoints}'; 

    graphite.find(findMetrics, function(error, results) { 
    // Map find results to array and set to graphite.metric object type 
    var metrics = results.sort().map(function(i) { return graphite.metric(i); }); 

    // Loop through the array and print stuff to "graphs" div 
    for (var i=0;i<metrics.length;i++){ 
     var metricName = metrics[i].toString().split('.'); 

     d3.select("#graphs").call(function(div) { 
     div.append("div").selectAll(".horizon") 
      .data([metrics[i]]) 
      .enter().append("div") 
      .attr("class", "horizon") 
      .style("font-size", "10px") 
      .call(context.horizon().title(metricName[metricName.length-1])); 
     }); 
    } 
    }); 
</script> 

輸出示例: http://i.stack.imgur.com/s4rGZ.jpg

問題:

  • 應該在哪裏過濾在立體主義進行級別還是在D3之一?
  • 我如何告訴立體派或 D3不要繪製不包含任何數據的圖?

我希望有人能幫我解決這個問題。

在此先感謝您的幫助。

+1

您是否嘗試過檢查的指標是否調用D3之前空終於解決了這個問題?即例如'if(metrics [i] .length> 0){d3.select(...)}'。 –

回答

0

我已經通過添加功能「hideEmpty(真)」

https://github.com/square/cubism/pull/56

d3.select("#graphs").call(function(div) { 
    div.append("div").selectAll(".horizon") 
     .data([metrics[i]]) 
     .enter().append("div") 
     .attr("class", "horizon") 
     .style("font-size", "10px") 
     .call(context.horizon() 
        .hideEmpty(true) 
        .title(metricName[metricName.length-1])); 
    });