2017-03-02 52 views
1

我正在使用此代碼爲d3.js使用數據集的直方圖佈局。但是,矩形的起始位置不是0.根據直方圖佈局,起始位置應始終爲0,但不知何故,我不會得到0.請在出現錯誤時請幫助我購買指向。d3.layout.histogram()返回錯誤的輸出

謝謝。

參考教程視頻 - https://youtu.be/0CZ7-f9wXiM?list=PL6il2r9i3BqH9PmbOf5wA5E1wOG3FT22p

的jsfiddle - https://jsfiddle.net/tewjyfed/

create(dataset);   


function create(data) {   
    var map = data.map(function(i) { return parseInt(i.skill) }); 
    var histogram = d3.layout.histogram() 
         .bins(7) 
         (map); 

    var yscale = d3.scale.linear() 
        .domain([0, d3.max(histogram.map(function(i) { return i.length }))]) 
        .range([0, height]); 

    var xscale = d3.scale.linear() 
        .domain([0, d3.max(map)]) 
        .range([0, width]); 

    var axis = d3.svg.axis() 
        .scale(xscale) 
        .orient('bottom'); 

    var bar = svg.selectAll('bar') 
       .data(histogram) 
       .enter() 
       .append('g'); 

    bar.append('rect') 
     .attr('x', function(d) { return xscale(d.x)}) 
     .attr('y', function(d) { return height - yscale(d.y) }) 
     .attr('width', function(d) { return xscale(d.dx) }) 
     .attr('height', function(d) { return yscale(d.y)}) 
     .attr('fill', 'lightsteelblue') 
     .attr('stroke', 'steelblue'); 

     svg.append('g') 
     .attr('transform', 'translate(0, '+height +')')      
     .call(axis); 
} 

回答

0

默認情況下,直方圖的範圍是數據的最小/最大,所以從5開始,您可以明確的指定儘管從0開始,通過調用.histogram().range([0, d3.max(map)])

的jsfiddle:https://jsfiddle.net/rm9tozcg/

var width = 500; 
var height = 500; 
var padding = 50; 
var dataset = [ 
{"name": "a", "skill": 60}, 
{"name": "b", "skill": 65}, 
{"name": "c", "skill": 23}, 
{"name": "d", "skill": 47}, 
{"name": "e", "skill": 38}, 
{"name": "f", "skill": 27}, 
{"name": "g", "skill": 24}, 
{"name": "h", "skill": 16}, 
{"name": "i", "skill": 36}, 
{"name": "j", "skill": 57}, 
{"name": "k", "skill": 77}, 
{"name": "l", "skill": 5}, 
{"name": "m", "skill": 46}, 
{"name": "n", "skill": 29}, 
{"name": "o", "skill": 55}, 
{"name": "p", "skill": 68}, 
{"name": "q", "skill": 40}, 
{"name": "r", "skill": 21}, 
{"name": "s", "skill": 14}, 
{"name": "t", "skill": 5}, 
{"name": "u", "skill": 63}, 
{"name": "v", "skill": 99}, 
{"name": "w", "skill": 89}, 
{"name": "x", "skill": 77}, 
{"name": "y", "skill": 12}, 
{"name": "z", "skill": 90} 
]; 



var svg = d3.select("body").append("svg") 
     .attr("width", width + 100) 
     .attr("height", height + padding) 
      .append("g") 
      .attr('transform', 'translate(20,0)') 

    create(dataset);   


    function create(data) {   
     var map = data.map(function(i) { return parseInt(i.skill) }); 
     var maxValue = d3.max(map); 

     var histogram = d3.layout.histogram() 
          .range([0, maxValue]) 
          .bins(7) 
          (map); 

     var yscale = d3.scale.linear() 
         .domain([0, d3.max(histogram.map(function(i) { return i.length }))]) 
         .range([0, height]); 

     var xscale = d3.scale.linear() 
         .domain([0, maxValue]) 
         .range([0, width]); 

     var axis = d3.svg.axis() 
         .scale(xscale) 
         .orient('bottom'); 

     var bar = svg.selectAll('bar') 
        .data(histogram) 
        .enter() 
        .append('g'); 

     bar.append('rect') 
      .attr('x', function(d) { return xscale(d.x)}) 
      .attr('y', function(d) { return height - yscale(d.y) }) 
      .attr('width', function(d) { return xscale(d.dx) }) 
      .attr('height', function(d) { return yscale(d.y)}) 
      .attr('fill', 'lightsteelblue') 
      .attr('stroke', 'steelblue'); 

      svg.append('g') 
      .attr('transform', 'translate(0, '+height +')')      
      .call(axis); 

}