Javascript 实时D3气泡图(圆形包装)
我正试图在d3.js中创建一个实时气泡图,该图本身很简单,因为显示的数据是一个非嵌套数组。只是大小不同的泡泡 通过ajax从MVC控制器获取初始数据的初始气泡图如下所示:Javascript 实时D3气泡图(圆形包装),javascript,d3.js,transition,circle-pack,Javascript,D3.js,Transition,Circle Pack,我正试图在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 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);
}
});
};
});
如果有人有一个关于如何执行更新的好链接、示例或提示,我会很高兴。我想一定是这样
- 获取新数据
- 计算新模型
- 在新获取的数据中添加/删除新的/不再存在的节点
- 为所有现有节点启动转换
谢谢你的提示 IE决定自动缓存标准的“d3.json()”请求。因此,我转而使用带有“cache:false”的显式jQuery ajax请求。在它的基本形式中,更新现在起作用了,尽管代码可能仍然显示出我对d3的一些缺点 我想我会用它来可视化在我们的内部网电视网站上观看电视频道的用户数量,但我想我会切换到折线图。。然而,代码如下:
function dynamicBubbles() {
// call redraw every 5 sec
setInterval(function() {
redraw();
}, 5000);
var width = 960;
var height = 500;
// construct SVG container
var chart = d3.select("#dynD3").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(50, 50)");
// define our pack
var pack = d3.layout.pack()
.size([width, height - 50])
.padding(10);
function redraw() {
// get data from MVC controller
return $.ajax({
type: "GET",
async: true,
cache: false,
url: "/Nice/d3_getCoolBubble",
data: { },
success: function (data) {
// asign new data to existing layout
var node = chart.selectAll(".node")
.data(pack.nodes(data), function (d) { return d.name });
// access brand new data
node.enter().append("g")
.classed("node", true)
.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; })
.append("circle")
.attr("fill", function (d) { return d.children ? "#fff" : "steelblue" })
.attr("stroke", function (d) { return d.children ? "#fff" : "#ADADAD" })
.attr("stroke-width", "1")
.transition()
.attr("r", function (d) { return d.r });
node.transition()
.duration(2000)
.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });
node.select("circle")
.transition()
.duration(2000)
.attr("r", function (d) { return d.r; })
node.append("text")
.text(function (d) { return d.name; });
}
});
建议使用
attr()
方法可以接受键/值对对象,而不是为每个属性调用它。另外,为什么您有async:false
?async:false不是必需的,您是对的。你是说把链子上的attr()融化成一个?是的,我觉得它更干净$().attr({key:value,foo:bar})
您在末尾列出的步骤对我来说听起来不错。嗨,拉尔斯,是的,这些步骤对我来说也很有意义。但是当我只能读它的时候,我觉得不得不用拉丁语交谈。它在英语中被称为诵读困难症,在德语中是“legstifie”(与我的想法相反,它不是英语单词)