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

标签 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);
}

最佳答案

默认情况下,直方图的范围是数据的最小值/最大值,因此它从 5 开始。您可以通过调用 .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);

}

关于javascript - d3.layout.histogram() 返回错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42556014/

相关文章:

javascript - 尝试使用标记的模板字符串给出 'Uncaught SyntaxError: Unexpected token'

javascript - 如何创建 API 或指向我的 SVG 的链接以便其他网站可以显示它?

javascript - jest 不理解流类型和对象解构?

javascript - 从 Xamarin C# 应用程序将图像上传到 Node JS 服务器上的 Multer

c# - 打印 <div> 标签内的图表

javascript - 选中时更改段落的字体大小

javascript - enter() 选择上的 extra select() 究竟做了什么?

javascript - 在 d3 v5 中设置小倍数条形图的正确方法是什么?

javascript - For 循环在 D3.js 中不起作用

svg - D3 - SVG元素上的定位工具提示不起作用