2013-07-02 113 views
2

我想創建一個d3直方圖,但列不顯示。我是d3新手,花費了數小時的時間試圖弄清楚它沒有成功。d3.js直方圖不顯示列

這裏是我的jsfiddle http://jsfiddle.net/nallad1985/5MZKK/1/

 var formatCount = d3.format(",0f"); 
     var values = [3866, 3874, 3876, 3887, 3888, 3896, 3897, 3900, 3904, 3908, 3916, 3916]; 

     var margin = {top: 10, right: 30, bottom: 30, left: 30}, 
       width = 500 - margin.left - margin.right, 
       height = 300 - margin.top - margin.bottom; 

     var x = d3.scale.linear() 
       .domain([d3.min(values), d3.max(values)]) 

       .nice() 
       .range([0, width]); 

     // Generate a histogram using twenty uniformly-spaced bins. 
     var data = d3.layout.histogram() 
       .bins(x.ticks(20)) 
       (values); 



     var y = d3.scale.linear() 
       .domain([0, d3.max(data, function(d) { return d.y; })]) 
       .range([height, 0]) 
       ; 



     var xAxis = d3.svg.axis() 
       .scale(x) 
       .orient("bottom"); 

     var svg = d3.select("body").append("svg") 
       .attr("width", width + margin.left + margin.right) 
       .attr("height", height + margin.top + margin.bottom) 
       .append("g") 
       .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

     var bar = svg.selectAll(".bar") 
       .data(data) 
       .enter().append("g") 
       .attr("class", "bar") 
       .attr("transform", function(d) { return "translate(" + x(d.x) + "," + y(d.y) + ")"; }); 

     bar.append("rect") 
       .attr("x", 100) 
       .attr("width", x(data[0].dx) - 1) 
       .attr("height", function(d) { return height - y(d.y); }); 

     bar.append("text") 
       .attr("dy", ".75em") 
       .attr("y", 6) 
       .attr("x", x(data[0].dx)/2) 
       .attr("text-anchor", "middle") 
       .text(function(d) { return formatCount(d.y); }); 

     svg.append("g") 
       .attr("class", "x axis") 
       .attr("transform", "translate(0," + height + ")") 
       .call(xAxis); 

回答

1

這是很老,所以你可能想通了,但對我們的誰剪切和粘貼邁克·博斯托克的直方圖代碼想不通爲什麼它的其餘部分當數據發生變化時不再有效,問題是如何通過x線性標度來縮放列寬。

var x = d3.scale.linear() 
      .domain([d3.min(values), d3.max(values)]) 
      .nice() 
      .range([0, width]); 

由x定義的線性比例尺不能用於變換寬度;它只能安全​​地用於轉換位置。 (至少在它的方式被稱爲如下 - 我有點新手,有可能是我不知道的方法)

.attr("width", x(data[0].dx) - 1) 

我想出了最快的解決方法是

.attr("width", (x(data[0].dx) - x(0)) - 1) 

但可能有更多的習慣解決方案。

該代碼在bl.ocks.org的示例中起作用,因爲該域從0開始 - 如果您的域沒有,則無法以這種方式縮放寬度。