【发布时间】:2016-08-14 05:57:21
【问题描述】:
我正在尝试制作我从this example 修改的实时更新分组条形图。我希望图表能够随着数组大小的变化反映我的数据数组的大小,但是在我当前的代码中,d3 图表停留在数据数组的初始长度上并且不会随着数组一起增长,这将是达到一定长度时受到限制。
为什么我可以更新图表中条形的值,但不能随着数据集大小的变化而改变条形的数量?
我的代码在下面,在这个fiddle。
<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.js