3

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

更新の実行方法について、誰かが良いリンク、例、またはヒントを持っていれば幸いです。私はそれが次のようなものでなければならないと思います

  • 新しいデータを取得する
  • 新しいモデルを計算する
  • 新しくフェッチされたデータに新しい/なくなったノードを追加/削除します
  • 既存のすべてのノードの遷移を開始します

ヒントをありがとう!

4

1 に答える 1

3

IE は、標準の「d3.json()」リクエストを AUTO-CACHE することにしました。そこで、「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; });

    }
});
于 2013-11-03T15:17:41.627 に答える