好的,这是关于d3js中转换和更新数据的一个非常基本的问题。 (我是0.1级菜鸟。)我正在为坦桑尼亚的城市人口导入GeoJSON和CSV数据。到目前为止看起来像这样:
我现在想要更新价值观,及时回顾2002,2998,1988等城市人口。这些先前的填充值是我的CSV中的单独列。而我却无法打电话给他们。我正在尝试的是:
d3.select(window)
.on("click", function() {
svg.selectAll("circle")
.data(data)
.transition()
.append("circle")
.attr("cx", function(d) {
return projection([d.lon, d.lat])[0];
})
.attr("cy", function(d) {
return projection([d.lon, d.lat])[1];
})
.attr("r", function(d) {
return Math.sqrt(parseInt(d.y2002) * 0.0004);
})
.style("fill", "gold")
.style("opacity", 0.75);
});
完整代码为here。我的基本想法是,我需要返回一个级别,调用所有圈子,重新加入数据,然后重新定义所有属性。但后者似乎效率低下。而且我感到困惑:我担心CSV调用的异常性,我担心我所处的父母/孩子的“水平”(以及我如何能够“向上”移动水平?)。
我是JavaScript和d3js的新手,所以这是一个非常基本的问题。我已经阅读了great tutorials by Scott Murray,我理解原则上的转换/更新。但我现在对如何应用它们很困惑:特别是在从同一个源调用数据时(只是电子表格中的不同列!)。
答案 0 :(得分:4)
您已拥有数据,因此无需再次调用d3.csv
。城市的位置也是相同的,因此您需要更新的唯一内容是半径(和工具提示) - 您甚至不需要重新绑定数据。这看起来像这样。
svg.selectAll("circle")
.transition()
.attr("r", function(d) {
return Math.sqrt(parseInt(d.y2003) * 0.0004);
});
请注意,我在这里更改了引用的列。这是你需要做的唯一改变。