javascript - d3.js 序数轴未正确更新

标签 javascript charts d3.js

我创建了一个简单的、可更新的 d3.js 条形图。 除了 x 轴,它工作正常。

当我从图表中删除条形图时,相应的轴标签不会被删除。

initial bars removed bars first time with wrong axis

但是当我第二次删除条形时,在第一次运行中删除的条形标签将从轴上删除。

removed bard second time with correct axis

这里发生了什么,为什么?

在此处查看工作演示:http://jsfiddle.net/vACua/4/

js代码如下:

    var BarChart = function (config) {

    var data,
    svg,
    xScale,
    yScale,
    yAxis,
    xAxis;

   svg = d3.select('#' + config.targetElement).append('svg');

    svg.attr("width", config.width + config.margin.left + config.margin.right)
        .attr("height", config.height + config.margin.top + config.margin.bottom)
        .attr("transform", "translate(" + config.margin.left + "," + config.margin.top + ")");

    xScale = d3.scale.ordinal();
    yScale = d3.scale.linear();

    xAxis = d3.svg.axis().scale(xScale).orient("bottom").tickSize(-config.height, 0).tickPadding(6);
    svg.append('g').classed('x-axis-group axis', true);

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


    // All methods and members defined here are public
    return {
        setData: function (newData) {
            data = newData;
            this.updateChart();
        },
        updateChart: function () {
            var xDomain = data.map(function (d) {
                return d.name;
            }),
                yDomain = data.map(function (d) {
                    return d.value;
                });



            xScale.domain(xDomain)
                .rangeRoundBands([config.margin.left, config.width], 0.05);

            yScale.domain([0, d3.max(data, function (d) {
                return d.value;
            })])
                .range([config.height, 0]);


            xAxis.scale(xScale)
                .orient("bottom")
                .tickSize(-config.height, 0)
                .tickPadding(6);

            var dataSections = svg.selectAll("g.bar")
                .data(data, function (d) {
                return d.name;
            });


            // adding new bars
            dataSections.enter()
                .append('g')
                .attr('class', 'bar')
                .append("rect")
                .attr("height", 0);

            var transition = svg.transition().duration(750);

            transition.selectAll("g.bar").select('rect')
                .attr("x", function (d, i) {
                return xScale(d.name);
            })
                .attr("y", function (d) {
                return yScale(d.value);
            })
                .attr("width", xScale.rangeBand())
                .attr("height", function (d) {
                return height - yScale(d.value);
            });


            dataSections.exit().transition().remove();



            svg.select('.x.axis')
                .transition()
                .duration(500)
                .attr({
                transform: 'translate(0,' + (config.height) + ')'
            })
                .call(xAxis);




        }
    };
};

var margin = {
    top: 20,
    right: 20,
    bottom: 30,
    left: 40
},
width = 960 - margin.left - margin.right,
    height = 250 - margin.top - margin.bottom;


amount = 15;

function init() {
    var margin = {
        top: 20,
        right: 20,
        bottom: 30,
        left: 40
    },
    width = 400 - margin.left - margin.right,
        height = 250 - margin.top - margin.bottom;

    var chart = BarChart({
        targetElement: 'foo',
        margin: margin,
        width: width,
        height: height
    });

    setRandomData = function () {
        var data = [];
        for (var i = 0; i <= amount; i++) {
            data.push({
                name: "a" + i,
                value: Math.floor((Math.random() * 300) + 1)
            });
        }
        amount = amount - 5;

        chart.setData(data);
    }
}

init();
setRandomData();
setTimeout(setRandomData, 2000);
setTimeout(setRandomData, 4000);

最佳答案

好吧,我完全不知道为什么要搬家

svg.select('.x.axis')
    .transition()
    .duration(500)
    .attr({transform: 'translate(0,' + (config.height) + ')'})
    .call(xAxis);

在这一行之前:

var transition = svg.transition().duration(750);

似乎按您预期的方式工作:http://jsfiddle.net/Y274x/

关于javascript - d3.js 序数轴未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18531460/

相关文章:

javascript - moment.js 连接日期和时间

javascript - Chart.js 未显示在在线站点上

javascript - 如何在 d3.js 中创建动态条形图?

javascript - 使用 D3.js 围绕 SVG Circle 的矩形之间的间隙并不通用

javascript - 如何调整 Flot 库插件之一的大小?

javascript - 使用 javascript 添加到 DOM 的 SVG 不可见。

javascript - VueJS - 从子组件到父组件的通信不起作用

javascript - 为什么 jQuery mask 说它不是一个函数?

javascript - 尝试使用 Raphael 获取元素的位置时出现错误 : this. attr 不是函数

javascript - 在 Google 图表中从第一个点到最后一个点绘制一条线