5

我正在尝试使用 d3.js 创建一个随时间绘制值的实时条形图

我就是这样做的。

var dataset = [ 5, 10, 15, 20, 25 ];
var w = 1800;
var h = 500;
var barPadding = 1;

setInterval(function(){
    dataset.push(Math.floor(Math.random()*51));
    draw();
},1000);

function draw(){

    d3.select("svg").remove();
    var svg = d3.select("body")
            .append("svg")
        .attr("width", w)
        .attr("height", h);

    svg.selectAll("rect").data(dataset)
        .enter()
        .append("rect")
        .attr("x", function(d, i){return 12*i;})
        .attr("y", function(d){return h -d*4; })
        .attr("width", 11)
        .attr("height", function(d) { return d * 4; })
        .attr("fill", "teal")
        .attr("fill", function(d) { return "rgb(0, 0, " + (d * 10) + ")";});
}

问题是每次将新值添加到数据数组时,我都会重新绘制整个图形。

每次将新值添加到数组时,如何将条形附加到已绘制的条形图上,而不是每次都重新绘制?

4

2 回答 2

4

你已经接近了,停止重绘svg元素。如果您只需要添加新元素,那么这就是您的绘图函数在调用时应该执行的操作。

var dataset = [ 5, 10, 15, 20, 25 ];
var w = 1800;
var h = 300;
var barPadding = 1;

var container = d3.select("body").append("svg").attr("width", w).attr("height", h).append("g");

setInterval(function(){
    dataset.push(Math.floor(Math.random()*51));
    draw();
},1000);

function draw(){

    container.selectAll("rect").data(dataset).enter().append("rect")
        .attr("x", function(d, i){return 12*i;})
        .attr("y", function(d){return h -d*4; })
        .attr("width", 11)
        .attr("height", function(d) { return d * 4; })
        .attr("fill", "teal")
        .attr("fill", function(d) { return "rgb(0, 0, " + (d * 10) + ")";});
}​

http://jsfiddle.net/Wexcode/LYqfU/

于 2012-12-14T05:47:30.683 回答
2

不确定你在寻找什么样的效果,但看看这个 fiddle

以下redraw函数将继续添加到条形图中,因此它将继续向右增长:

function redraw() {
     var rect = svg.selectAll("rect")
         .data(dataset);

     rect.enter().insert("rect", "line")
         .attr("x", function(d, i) { return 12*(i+1); })
         .attr("y", function(d) { return h -d*4 })
         .attr("width", 11)
         .attr("height", function(d) { return d * 4; })
         .attr("fill", "teal")
         .attr("fill", function(d) { return "rgb(0, 0, " + (d * 10) + ")";})

     rect.transition()
         .duration(800)
         .attr("x", function(d, i) { return 12*i; });

}

借自mbostock 教程

于 2012-12-13T23:56:44.297 回答