【问题标题】:D3.js -- Ordinal scale (version 3 to version 4)D3.js -- 序数比例(版本 3 到版本 4)
【发布时间】:2016-09-26 06:25:13
【问题描述】:

我正在参加关于 D3.js 的 Udemy 课程。

不幸的是,由于新版本 D3.js 的出现,没有任何关于其新语法的最新教程,所以我浏览了他们的 API wiki。

话虽如此,我一直在纠结如何翻译这段代码(第 3 版)。我正在学习序数比例

var data = [
    {key: "Glazed",     value: 132},
    {key: "Jelly",      value: 71},
    {key: "Holes",      value: 337},
    {key: "Sprinkles",  value: 93},
    {key: "Crumb",      value: 78},
    {key: "Chocolate",  value: 43},
    {key: "Coconut",    value: 20},
    {key: "Cream",      value: 16},
    {key: "Cruller",    value: 30},
    {key: "Éclair",     value: 8},
    {key: "Fritter",    value: 17},
    {key: "Bearclaw",   value: 21}
];
var w = 800;
var h = 450;
var margin = {
    top: 20,
    bottom: 20,
    left: 20,
    right: 20
};
var width = w - margin.left - margin.right;
var height = h - margin.top - margin.bottom;
var x = d3.scale.linear()
        .domain([0, d3.max(data, function(d){
            return d.value;
        })])
        .range([0, width]);
var y = d3.scale.ordinal()
        .domain(data.map(function(entry){
            return entry.key;
        }))
        .rangeBands([0, height]);
var svg = d3.select("body").append("svg")
            .attr("id", "chart")
            .attr("width", w)
            .attr("height", h);
var chart = svg.append("g")
            .classed("display", true)
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
function plot(params){
    this.selectAll(".bar")
        .data(params.data)
        .enter()
            .append("rect")
            .classed("bar", true)
            .attr("x", 0)
            .attr("y", function(d,i){
                return y(d.key);
            })
            .attr("height", function(d,i){
                return y.rangeBand()-1;
            })
            .attr("width", function(d){
                return x(d.value);
            });
    this.selectAll(".bar-label")
        .data(params.data)
        .enter()
            .append("text")
            .classed("bar-label", true)
            .attr("x", function(d){
                return x(d.value);
            })
            .attr("dx", -4)
            .attr("y", function(d,i){
                return y(d.key);
            })
            .attr("dy", function(d,i){
                return y.rangeBand()/1.5+2;
            })
            .text(function(d){
                return d.value;
            })
}
plot.call(chart, {data: data});

到版本 4。

查看他们的API Wiki,似乎摆脱了rangeBand函数CHANGES.MD

我已经尽力翻译了,但我无法弄清楚它有什么问题:

var data = [
    {key: "Glazed",     value: 132},
    {key: "Jelly",      value: 71},
    {key: "Holes",      value: 337},
    {key: "Sprinkles",  value: 93},
    {key: "Crumb",      value: 78},
    {key: "Chocolate",  value: 43},
    {key: "Coconut",    value: 20},
    {key: "Cream",      value: 16},
    {key: "Cruller",    value: 30},
    {key: "Éclair",     value: 8},
    {key: "Fritter",    value: 17},
    {key: "Bearclaw",   value: 21}
];
var w = 800;
var h = 450;
var margin = {
    top: 20,
    bottom: 20,
    left: 20,
    right: 20
};
var width = w - margin.left - margin.right;
var height = h - margin.top - margin.bottom;
var x = d3.scaleLinear()
        .domain([0, d3.max(data, function(d){
            return d.value;
        })])
        .range([0, width]);
var y = d3.scaleOrdinal()
        .domain(data.map(function(entry){
            return entry.key;
        }))
        .range([0, height]);

var svg = d3.select("body").append("svg")
            .attr("id", "chart")
            .attr("width", w)
            .attr("height", h);
var chart = svg.append("g")
            .classed("display", true)
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
function plot(params){
    this.selectAll(".bar")
        .data(params.data)
        .enter()
            .append("rect")
            .classed("bar", true)
            .attr("x", 0)
            .attr("y", function(d,i){
                return y(d.key);
            })
            .attr("height", function(d,i){
                return y.range(1)-1;
            })
            .attr("width", function(d){
                return x(d.value);
            });
    this.selectAll(".bar-label")
        .data(params.data)
        .enter()
            .append("text")
            .classed("bar-label", true)
            .attr("x", function(d){
                return x(d.value);
            })
            .attr("dx", -4)
            .attr("y", function(d,i){
                return y(d.key);
            })
            .attr("dy", function(d,i){
                return y.range(1)/1.5+2;
            })
            .text(function(d){
                return d.value;
            })
}
plot.call(chart, {data: data});

Working Version 3

Not Working Version 4

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    下面是工作代码。

    v4 不支持 scale.oridnal,因此使用 scaleBand。

    var data = [
        {key: "Glazed",     value: 132},
        {key: "Jelly",      value: 71},
        {key: "Holes",      value: 337},
        {key: "Sprinkles",  value: 93},
        {key: "Crumb",      value: 78},
        {key: "Chocolate",  value: 43},
        {key: "Coconut",    value: 20},
        {key: "Cream",      value: 16},
        {key: "Cruller",    value: 30},
        {key: "Éclair",     value: 8},
        {key: "Fritter",    value: 17},
        {key: "Bearclaw",   value: 21}
    ];
    var w = 800;
    var h = 450;
    var margin = {
        top: 20,
        bottom: 20,
        left: 20,
        right: 20
    };
    var width = w - margin.left - margin.right;
    var height = h - margin.top - margin.bottom;
    var x = d3.scaleLinear()
            .domain([0, d3.max(data, function(d){
                return d.value;
            })])
            .range([0, width]);
    /*var y = d3.scale.ordinal()
            .domain(data.map(function(entry){
                return entry.key;
            }))
            .rangeBands([0, height]);*/
    var y = d3.scaleBand()
            .domain(data.map(function(entry){
                return entry.key;
            }))
        .rangeRound([0, height])
        .padding(0.1);      
    
    var svg = d3.select("body").append("svg")
                .attr("id", "chart")
                .attr("width", w)
                .attr("height", h);
    var chart = svg.append("g")
                .classed("display", true)
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    function plot(params){
        this.selectAll(".bar")
            .data(params.data)
            .enter()
                .append("rect")
                .classed("bar", true)
                .attr("x", 0)
                .attr("y", function(d,i){
                    return y(d.key);
                })
                .attr("height", function(d,i){
                    return y.bandwidth()-1;
                })
                .attr("width", function(d){
                    return x(d.value);
                });
        this.selectAll(".bar-label")
            .data(params.data)
            .enter()
                .append("text")
                .classed("bar-label", true)
                .attr("x", function(d){
                    return x(d.value);
                })
                .attr("dx", -4)
                .attr("y", function(d,i){
                    return y(d.key);
                })
                .attr("dy", function(d,i){
                    return y.bandwidth()/1.5+2;
                })
                .text(function(d){
                    return d.value;
                })
    }
    plot.call(chart, {data: data});
    

    【讨论】:

    • 我不知道你为什么被否决,但这似乎是正确的答案。我这样标记
    • 突出显示任何更改,也许添加一些评论和解释
    • 这个答案很差,因为我不知道你做了什么。
    【解决方案2】:

    请查看d3.scaleBand()。 d3.v4 序数比例实现在 d3.scaleBand() 中可用。

    var data = [
        {key: "Glazed",     value: 132},
        {key: "Jelly",      value: 71},
        {key: "Holes",      value: 337},
        {key: "Sprinkles",  value: 93},
        {key: "Crumb",      value: 78},
        {key: "Chocolate",  value: 43},
        {key: "Coconut",    value: 20},
        {key: "Cream",      value: 16},
        {key: "Cruller",    value: 30},
        {key: "Éclair",     value: 8},
        {key: "Fritter",    value: 17},
        {key: "Bearclaw",   value: 21}
    ];
    var w = 500;
    var h = 300;
    var margin = {
        top: 20,
        bottom: 20,
        left: 20,
        right: 20
    };
    var width = w - margin.left - margin.right;
    var height = h - margin.top - margin.bottom;
    var x = d3.scaleLinear()
            .domain([0, d3.max(data, function(d){
                return d.value;
            })])
            .range([0, width]);
    var y = d3.scaleBand()
            .domain(data.map(function(entry){
                return entry.key;
            }))
            .range([height, 0])
    		.padding(0.1);
    
    var svg = d3.select("body").append("svg")
                .attr("id", "chart")
                .attr("width", w)
                .attr("height", h);
    var chart = svg.append("g")
                .classed("display", true)
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    function plot(params){
        this.selectAll(".bar")
            .data(params.data)
            .enter()
                .append("rect")
                .classed("bar", true)
                // .attr("x", function(d) { 
    				// return x(d.value); })
                .attr("y", function(d,i){
                    return y(d.key);
                })
                .attr("height", y.bandwidth())
                .attr("width", function(d){
                    return x(d.value);
                });
    
    }
    plot.call(chart, {data: data});
    .bar { fill: steelblue; }
    <script src="https://d3js.org/d3.v4.min.js"></script>

    【讨论】:

    • 我可以知道这个答案的问题吗?
    • 不知道为什么你也被否决了。除了缺少 text 属性外,它看起来还有效
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2017-09-25
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多