d3.layout.histogram()返回错误输出

时间:2017-03-02 12:50:35

标签: javascript d3.js

我正在使用此代码为d3.js使用数据集进行直方图布局。但是,矩形的起始位置不是0.根据直方图布局,起始位置应始终为0但不知何故我没有得到0.如果有任何错误,请帮我指点。

感谢。

参考教程视频 - 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);
}

1 个答案:

答案 0 :(得分:1)

默认情况下,直方图的范围是数据的最小值/最大值,因此从5开始。您可以通过调用.histogram().range([0, d3.max(map)])显式指定它,但是从0开始。

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);

}