d3图形大小未更新

我正在尝试制作一个实时更新的分组条形图,并从本示例中进行了修改我希望图表随着数组大小的变化而反映出我的数据数组的大小,但是在我当前的代码中,d3图表停留在数据数组的初始长度,并且不会随数组的增长而增加。达到一定长度时受到限制。

为什么我可以更新图形中条形的值,却不能随着数据集大小的变化而改变条形数?

我的代码在下面,在这个小提琴中

    <html>
    <body>
    <div id="disp"></div> 
    <script src="https://d3js.org/d3.v3.min.js"></script>
    <script>

    var main = function () {
        console.log(dataset.toString())
        var a  = { a: 'temp', b: 50+Math.floor(Math.random() * 30)}
        var b = { a: 'hum', b: 20+Math.floor(Math.random() * 20)}

        // add new elements
        dataset.push(a);    
        dataset.push(b);

       // limit to 8 elements
        if(dataset.length > 8){ 
        dataset.shift(); 
        dataset.shift();
        }
        //update graph
        update(dataset); 

    }

      // dataset below will show 6 bars animating
     // var dataset = [{ a: 'temp', b: 5},{ a: 'hum', b: 8},{ a: 'temp', b: 4},
     // { a: 'hum', b: 9},{ a: 'temp', b: 15},{ a: 'hum', b: 12}];

    var dataset = [{ a: 'temp', b: 5},{ a: 'hum', b: 8}];


    var w = 600;
    var h = 250;

    var xScale = d3.scale.ordinal()
            .domain(d3.range(dataset.length))
            .rangeRoundBands([0, w], 0.1);

    var rectw = 20;
    var yScale = d3.scale.linear()
            .domain([0, 80])
            .range([0, h]);

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

    var bars = svg.selectAll("g")
            .data(dataset);

    barsenter = bars.enter()
            .append('g')
            .attr('class', 'bars');


    barsenter
       .append("rect")
           .attr('class', 'temp')
       .filter(function(d){ return d.a == 'temp'})
       .attr("x", function(d, i) {
            return (rectw+2)*i*2;
       })
       .attr("y", function(d) {
            return h - yScale(d.b);
       })
       .attr("width", rectw)
       .attr("height", function(d) {
            return yScale(d.b);
       })
       .attr("fill", function(d) {
            return "rgb(" + (d.b * 4) +",0, 0)";
       });

    barsenter
       .append("rect")
           .attr('class', 'hum')
       .filter(function(d){ return d.a == 'hum'})
       .attr("x", function(d, i) {
            return rectw+2+(rectw+2)*i*2;
       })
       .attr("y", function(d) {
            return h - yScale(d.b);
       })
       .attr("width", rectw)
       .attr("height", function(d) {
            return yScale(d.b);
       })
       .attr("fill", function(d) {
            return  "rgb(0, 0, " + (d.b * 5) + ")";
       });


    // update function
    var update = function(dataset) {  

    bars.select(".temp")
       .data(dataset)
           .filter(function(d){ return d.a == 'temp'})
       .transition()
       .delay(function(d, i) {
           return i / dataset.length * 1000;
       })
       .duration(500)
       .attr("y", function(d) {
            return h - yScale(d.b);
       })
       .attr("height", function(d) {
            return yScale(d.b);
       })
       .attr("fill", function(d) {
            return "rgb(" + (d.b * 4) +",0, 0)";
       });

    bars.select(".hum")
       .data(dataset)
           .filter(function(d){ return d.a == 'hum'})
       .transition()
       .delay(function(d, i) {
           return i / dataset.length * 1000;
       })
       .duration(500)
       .attr("y", function(d) {
            return h - yScale(d.b);
       })
       .attr("height", function(d) {
            return yScale(d.b);
       })
       .attr("fill", function(d) {
            return  "rgb(0, 0, " + (d.b * 5) + ")";
       });

    }


    main();
    window.setInterval(function(){ main() }, 1000);

    </script>
    </body>
    </html>

在阅读了 两个描述之后,理解d3的enter()和exit()函数似乎是关键。

我编写了此代码片段,以演示带有更新功能的条形图。

//main code
// init data
var dataset = [];
function fillArray(arr){
 arr.push({'value' : Math.floor(Math.random()*50)});
}
for (var i = 0; i < 4; i++) {
fillArray(dataset);
}

// add 
var btnfunc = function(){
fillArray(dataset);
 //update graph
 update();
}

// remove 
var btnfunc2 = function(){
 dataset.pop()
//update graph
 update();
}

// randomize
var btnfunc3 = function(){
for (var i = 0; i < dataset.length; i++) { 
dataset[i].value = Math.floor(Math.random()*50);
}
//update graph 
update();
}


//d3 code
//init graph
var width = 700, height = 120;

var canvas = d3.select('#disp')
    .append('svg')
    .attr('width', width)
    .attr('height', height);

var x = d3.scale.linear()
        .domain([0, 10]) 
        .range([0, 700]);

var h = d3.scale.linear()
        .domain([0, 110])
        .range([0, height]); 

var y = d3.scale.linear()
        .domain([0, 80])
        .range([200, 0]);
//create selection
var bars = canvas.selectAll("rect");

//update function
function update(){
//update selection
bars = canvas.selectAll("rect").data(dataset);
//append new bars      
bars.enter().append("rect");
//bar attributes
bars
  .attr('width', 20)  
  .attr('height', function(d){ return h(d.value); }) 
  .attr('y', function(d){ return height - h(d.value); } )
  .attr('x', function (d, i) { return i*14*2; })
  .style('fill', 'red');
//remove bars
bars.exit().remove();

}

//1st display
update();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div id="disp"></div> 
<button onclick="btnfunc()">add</button>
<button onclick="btnfunc2()">remove</button>
<button onclick="btnfunc3()">random</button>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

d3图形大小未更新

来自分类Dev

d3图表未正确更新

来自分类Dev

根据更新的数据调整矩形大小(d3,js)

来自分类Dev

D3强制布局节点属性未正确更新

来自分类Dev

D3饼图未正确更新

来自分类Dev

如何在D3 JS中将图形与相应的矩形节点大小对齐

来自分类Dev

在D3中使用data(...)强制布局更新图形

来自分类Dev

为什么我的D3 SVG图形上的轴不更新?

来自分类Dev

D3 v4 图形不更新条形 - 但附加新的轴数据

来自分类Dev

D3轴在图形顶部渲染

来自分类Dev

d3图形内的文字颜色

来自分类Dev

更新数据后,React / D3中的点击事件未更新

来自分类Dev

使用新数据更新图表时,d3 条形图标签未更新

来自分类Dev

d3折线图和面积图未使用新数据数组更新

来自分类Dev

D3:数据对象中的值已更改,但表中未更新

来自分类Dev

更新位置后,D3强制链接未与节点连接

来自分类Dev

D3:数据对象中的值已更改,但表中未更新

来自分类Dev

如何在D3图形的边缘添加标签

来自分类Dev

在D3图形中设置条形的最小高度

来自分类Dev

无法从D3强制箭头图形中删除链接

来自分类Dev

绕D3图形中的轴旋转rect

来自分类Dev

用D3制作的图形上未出现圆圈

来自分类Dev

使用attrTween的d3收缩雷达图形状

来自分类Dev

在Rails视图中样式化D3图形

来自分类Dev

如何在D3图形的边缘添加标签

来自分类Dev

D3对页面上的图形进行动画处理

来自分类Dev

d3实时图形仅在延迟后才会显示

来自分类Dev

使用D3制作水平可拖动图形

来自分类Dev

D3 JS图形不显示线