更新时未从 D3 条形图中删除旧元素
old elements not removed from d3 bar chart on update
我正在 d3 中制作一个条形图,该条形图应该采用小型随机模拟模型的结果(在本例中为传染病传播的易感感染-康复模型),并将每天感染的新人数绘制为图表中条形的高度。
当我第一次运行模型时,这工作正常,但是在随后的运行中(使用 simulate() 函数或 html 中的"单击我"按钮)应该替换的旧元素(即上次运行中第 1 天感染的个体数量)没有显示在退出选择中,它始终为空。相反,新条形图会始终添加到末尾或绘制在现有条形图上。
我尝试了许多关键函数(包括没有键函数,以及将整数时间转换为字符串)。我确定我做错了什么,但不确定那是什么。因此,任何建议将不胜感激。
您还可以在此处找到此半工作代码的工作演示:
http://bl.ocks.org/jzelner/e06e2997429ada3534dc
谢谢!
var max_t = 20; N = 100; b = 1.1 total_id = 0;
function outbreak() {
var S = N-1;
var I = 1;
var done = 0;
var incidence = [{t:0, I:I, name: String(0)}];
for (t = 1; t < max_t; t++) {
var p_inf = 1.0-Math.exp(-b*I/N);
var new_I = 0;
for (i = 0; i < S; i++) {
if (Math.random() < p_inf) {
new_I++;
}
}
if (new_I == 0) {
break;
done = 1;
}
incidence.push({t:t, I:new_I, name:String(t)});
total_id++;
S -= new_I;
I = new_I;
}
return(incidence);
}
incidence = outbreak();
var margin = {top: 20, right: 20, bottom: 70, left: 40},
width = 600 - margin.left - margin.right,
height = 300 - margin.top - margin.bottom;
// Parse the date / time
var x = d3.scale.ordinal().rangeRoundBands([0, width], .05);
var y = d3.scale.linear().range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10);
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
xvals = [];
for (i = 0; i <= 20; i++){
xvals.push(i);
}
x.domain(xvals);
y.domain([0, 20]);
function render(zz) {
console.log(zz)
var bar = svg.selectAll("bar")
.data(zz, function(d) { return d.name;});
bar.exit().remove();
bar.attr("class", "update")
.attr("x", function(d) { return x(d.t); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.I); })
.attr("height", function(d) { return height - y(d.I); });
console.log("UPDATE", bar)
console.log("ENTER", bar.enter())
bar.enter().append("rect")
.attr("class", "enter")
.attr("x", function(d) { return x(d.t); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.I); })
.attr("height", function(d) { return height - y(d.I); });
bar
.attr("x", function(d) { return x(d.t); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.I); })
.attr("height", function(d) { return height - y(d.I); });
}
render(incidence);
function simulate() {
render(outbreak());
}
如注释中所述,这样做:
svg.selectAll("path")
.attr({
d: line(data)
});
取而代之的是:
svg.append("path")
.data([data])
.attr("class", "line")
.attr("d", line);
解决了我的问题。
相关文章:
- 从组件状态的数组中删除元素
- 从数组中删除元素的最佳方法是:javascript/jquery
- 正则表达式条件来删除元素
- 使用javascript删除元素时出现的问题
- 当会话存储阵列中存在大量元素时,如何从中删除元素
- 从角度数组中删除元素
- AngularJs localStorage在循环中删除元素
- 在使用jquery插入之前删除元素
- 如何删除元素列表中的类并添加到另一个元素 Jquery.
- 更新分组条形图(转换或删除元素组)
- 向下滚动后如何用同一类逐个删除元素
- 如何防止 jQuery 事件在删除元素时冒泡
- 从jQuery对象中删除元素
- 如何删除元素的结束标记,添加一些文本,然后重新添加标记
- 从画布中删除元素
- 如何解析html以删除元素并只返回其位置的标题
- 使用 V8 从密集数组中删除元素的最佳方法是什么
- 如何使用jquery删除元素
- 根据成员属性从数组中删除元素
- 从中删除元素'的父元素,并将其附加到其他元素