javascript - d3.js 更新视觉

标签 javascript jquery jquery-ui d3.js

我有一个用 d3.js 放在一起的树状图。我通过 getJSON 填充数据。它很好用。但是,我在 setInterval 方法中具有此功能,而且它似乎不会自行刷新。

    var treemap = d3.layout.treemap()
.padding(4)
.size([w, h])
.value(function(d) { return d.size; });

var svg = d3.select("#chart").append("svg")
.style("position", "relative")
.style("width", w + "px")
.style("height", h + "px");



function redraw3(json) {
  var cell = svg.data([json]).selectAll("g")
      .data(treemap)
    .enter().append("g")
      .attr("class", "cell")
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  cell.append("rect")
      .attr("width", function(d) { return d.dx; })
      .attr("height", function(d) { return d.dy; })
      .style("fill", function(d) { return d.children ? color(d.data.name) : null; });

  cell.append("text")
      .attr("x", function(d) { return d.dx / 2; })
      .attr("y", function(d) { return d.dy / 2; })
      .attr("dy", ".35em")
      .attr("text-anchor", "middle")
      .text(function(d) { return d.children ? null : d.data.name; });

}



setInterval(function() {
d3.json("http://localhost:8080/dev_tests/d3/examples/data/flare2.json", function(json) {
redraw3(json);
});
}, 3000);

我的具体问题是,为什么当我更改 json 文件中的数据时,它不会在 3 秒后显示在树状图中?

提前谢谢你。

最佳答案

数据中有什么?因为如果数据数组具有相同的长度,则 enter() 选择(对应于先前未绑定(bind)的数据)的长度将为零。 Mike Bostock 写了一个很棒的教程,名为 Thinking with Joins ,我建议您在继续之前阅读。

svg.data() 调用似乎是多余的,为了清楚起见,我建议改为这样做:

var leaves = treemap(json);
console.log("leaves:", leaves); // so you can see what's happening

// cell here is the bound selection, which has 3 parts
var cell = svg.selectAll("g")
  .data(leaves);
// you might want to console.log(cell) here too so you can take a look

// 1. the entering selection is new stuff
var entering = cell.enter()
  .append("g")
entering.append("rect")
  // [update rectangles]
entering.append("text")
  // [update text]

// 2. the exiting selection is old stuff
cell.exit().remove();

// 3. everything else is the "updating" selection
cell.select("rect")
  // [update rectangles]
cell.select("text")
  // [update text]

您还可以将单元格的更新封装在一个函数中,并在输入和更新选择时都“调用”它,这样您就不必两次编写相同的代码:

function update() {
  cell.select("rect")
    // [update rectangles]
  cell.select("text")
    // [update text]
}

entering.append("rect");
entering.append("text");
entering.call(update);

cell.call(update);

关于javascript - d3.js 更新视觉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649958/

相关文章:

javascript - Foundation 5 中的响应式选项卡

javascript - 悬停时展开内容

javascript - if else 语句中的多个 if else - 模拟滚动

javascript - 控制拖动事件移动到特定的div

javascript - 动态添加/删除多个输入字段

javascript - 'querySelectorAll' 上的无效选择器使用变量作为 id

javascript - 在 jquery 中访问动态加载的数据

javascript - 检索 <a> 标签的 onclick 监听器并删除以使其变为 'disabled'

javascript - RequireJS:无法读取回调中未定义的属性

javascript - jQuery 可拖动在拖动开始时更改图像大小,在恢复时恢复原始大小