8

次のような方法で、チーム コラボレーション データを視覚化しようとしています。

各チームおよび週のさまざまなコラボレーション成果物タイプのシェアを表示するグラフ

グラフ内のさまざまな色は、さまざまなコラボレーション アーティファクト タイプです。

ソースからのデータは次のようになります。

var json = [
    {
        "teamLabel": "Team 1",
        "created_date": "2013-01-09",
        "typeLabel": "Email"
        "count": "5"
    },
    {
        "teamLabel": "Team 1",
        "created_date": "2013-01-10",
        "typeLabel": "Email"
        "count": "7"
    },
    /* and of course, a lot more data of this kind */
]

データは 1 日分であることに注意してください。したがって、上記の視覚化では、最初に週に基づいてデータを集計する必要があります。ただし、チーム名と案件タイプは保持する必要があり、グループ化属性として使用されます。コードは次のとおりです。

// "2013-01-09"
var dateFormat = d3.time.format.utc("%Y-%m-%d");

// "2013-02" for the 2nd week of the year
var yearWeek = d3.time.format.utc("%Y-%W");

var data = d3.nest().key(function(d) {
        return d.teamLabel;
    }).key(function(d) {
        var created_date = dateFormat.parse(d.created_date);
        return yearWeek(created_date);
    })
    .key(function(d) {
        return d.typeLabel;
    }).rollup(function(leaves) {
        return d3.sum(leaves, function(d) {
                return parseInt(d.count);    // parse the integer
            });
        }
    )
    .map(json);

これにより、ネスト キーに基づくオブジェクト階層が作成されます。dataこれから上記のチャートを作成する方法がわからないので、次の構造に変換する方法を探しています。

[
    // This list contains an element for each donut
    {
        "teamLabel": "Team 1",
        "createdWeek": "2013-02",
        "values": [
            // This list contains one element for each type we found
            {
                "typeLabel": "Email",
                "count": 12
            },
            {
            ...
            }
        ]
    },
    {
    ...
    }
]

このようにして、x 軸と y 軸の配置にそれぞれ と を使用でき、以下の情報をcreatedWeekに渡すことができます。teamLabelvaluesd3.layout.pie()

このデータ変換を行うクリーンな方法はありますか? 説明や詳細が必要な場合は、お知らせください。

4

1 に答える 1

4

それがあなたのやり方です:

var flat = data.entries().map(function(d){
    return d.value.entries().map(function(e){
        return {
            "teamLabel": d.key,
            "createdWeek": e.key,
            "values": e.value.entries().map(function(f){
                return {"typeLabel": f.key, "count": f.value}
            })
        }
    })
}).reduce(function(d1,d2){ return d1.concat(d2) },[]);

map.entries() ヘルパー関数を使用するために、標準の JavaScript オブジェクトの代わりに d3.map を使用していることに注意してください。使用しているという事実から判断して、それがあなたが試したことだと思います:

.map(json); // whereas I used .map(json, d3.map)

それ以外の

.entries(json);

jsFiddle リンクはこちら:

http://jsfiddle.net/RFontana/KhX2n/

于 2013-10-22T12:40:26.157 に答える