【问题标题】:Realtime D3 bubble chart (circle pack)实时 D3 气泡图(圆包)
【发布时间】: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


【解决方案1】:

IE 决定自动缓存标准的“d3.json()”请求。所以我用'cache:false'切换了一个显式的jQuery ajax请求。在其基本形式中,更新现在可以工作了,尽管代码可能仍然表现出我对 d3 的一些遗留问题。

我想我会用它来可视化在我们的 Intranet 电视网站上观看电视频道的用户数量,但我想我会切换到折线图。不过,这里是代码:

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; });

    }
});

【讨论】:

  • 英文叫dylexia,德文叫“Legasthenie”(和我想的相反,不是英文单词)
猜你喜欢
  • 2021-12-13
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2020-04-20
  • 2018-12-08
相关资源
最近更新 更多