【发布时间】:2013-11-12 00:41:25
【问题描述】:
我正在尝试在 d3.js 中创建一个实时气泡图 图表本身很简单,因为显示的数据是一个非嵌套数组。只是大小不一的气泡。
具有通过 ajax 从 MVC 控制器获取的初始数据的初始气泡图是这样创建的:
var canvas = d3.select("#dynD3")
.append("svg")
.attr("width", 800)
.attr("height", 500)
.append("g")
.attr("transform", "translate(50, 50)");
var pack = d3.layout.pack()
.size([800, 450])
.padding(10);
d3.json("/Nice/d3_getCoolBubble", function (data) {
var nodes = pack.nodes(data);
console.log(data);
var node = canvas.selectAll(".node")
.data(nodes)
.enter()
.append("g")
.attr("class", "node")
.attr("transform", function (d) {
return "translate(" + d.x + "," + d.y + ")";
});
node.append("circle")
.attr("class", function (d) { return d.children ? "noupdate" : "update" })
.attr("id", function (d) { return d.name; })
.attr("r", function (d) { return d.r })
.attr("fill", function (d) { return d.children ? "#fff" : "steelblue" })
.attr("stroke", function (d) { return d.children ? "#fff" : "#000" })
.attr("stroke-width", "2");
node.append("text")
.text(function (d) { return d.children ? "" : d.name; });
添加到初始气泡的创建是对
的调用 tick()
功能。这个函数应该负责从 MVC 控制器获取新数据,然后执行转换。转换完成后,该方法再次调用自身:
function tick() {
$.ajax({
type: "GET",
async: false,
url: "/Nice/d3_getCoolBubble",
data: {},
success: function (result) {
console.log(result);
var update = canvas.selectAll(".update");
update.transition()
.duration(5000)
.attr("transform", function (d) {
return "translate(" + d.x + "," + d.y + ")";
})
.each("end", tick);
}
});
};
});
如果有人提供有关如何执行更新的良好链接、示例或提示,我会很高兴。我想它一定是这样的
- 获取新数据
- 计算新模型
- 在新获取的数据中添加/删除新的/不再存在的节点
- 为所有现有节点开始转换
感谢任何提示!
【问题讨论】:
-
作为建议,
attr()方法可以接受键/值对的对象,而不是为每个属性调用它。另外,为什么你有async: false? -
async: false 不需要,你是对的。您的意思是将链接的 attr() 融为一体?
-
是的,IMO 它只是更清洁。
$().attr({ key: value, foo: bar}) -
你最后列出的步骤对我来说听起来不错。
-
嗨 Lars,是的,这些步骤对我来说也很有意义。但是当我能读完它时,我觉得不得不用拉丁语说话..
标签: javascript d3.js transition circle-pack