【问题标题】:Flatten an Object hierarchy created with d3.js nesting展平使用 d3.js 嵌套创建的对象层次结构
【发布时间】:2013-01-11 00:58:52
【问题描述】:

我正在尝试以如下方式可视化团队协作数据:

图表中不同的颜色代表不同的协作工件类型。

来自源的数据如下所示:

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 */
]

请注意,数据是针对单日给出的。所以对于上面的可视化,我需要先根据一年中的星期来聚合数据。不过,团队名称和工件类型需要保留并用作分组属性。代码如下:

// "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
            },
            {
            ...
            }
        ]
    },
    {
    ...
    }
]

这样,我可以分别使用createdWeekteamLabel在x轴和y轴上进行定位,values下的信息可以传递给d3.layout.pie()

有没有一种干净的方法来进行这种数据转换?如果您需要任何澄清或更多详细信息,请告诉我。

【问题讨论】:

  • 你有没有发现如何做到这一点?
  • @cyroxx 我不确定我是否理解您的问题;您想将您提交的json 数据转换为按团队分组的新数组格式吗?
  • 我很困惑为什么你称之为扁平化,当你似乎是在向原来的扁平数据添加层时。 (我正在寻找扁平化嵌套数据集。)

标签: javascript d3.js


【解决方案1】:

你就是这样做的:

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() 辅助函数,我使用的是 d3.map 而不是标准的 javascript 对象。我想这就是您尝试使用的事实来判断的:

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

而不是

.entries(json);

jsFiddle 链接在这里:

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

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多