问题 d3.nest()键和值转换为name和children


我正在从csv文件创建一个Treemap。 csv文件中的数据是分层的,因此我使用了d3.nest()。 但是,生成的JSON采用{key:“United States”的形式,值:[...]} 可缩放的树图例如(http://mbostock.github.io/d3/talk/20111018/treemap.html) 需要等级为{name:“United States”,children:[...]}。 我已经尝试将名称和子项替换为示例中的键和值,但它不起作用。 如果有人已经考虑过在可缩放树形图上使用键和值,请提供帮助。我是D3的新手,我不知道d.children是否意味着数据的结构或价值。

这是使用d3将世界大陆,地区和国家/地区从CSV转换为层次结构的代码。

$ d3.csv("../Data/WorldPopulation.csv", function (pop) { var treeData= { "key": "World", "values": d3.nest() .key(function (d) { return d.Major_Region; }) .key(function (d) { return d.Region; }) .key(function (d) { return d.Country; }) .entries(pop) };

结果的前几行是:

 `[{"key":"AFRICA","values":[{"key":"Eastern Africa","values"
 [{"key":"Burundi","values":[.........`

我无法使用zoomable treemap,因为它需要json中的name和children标签,而不是key和values。


11912
2017-07-02 01:44


起源

在转换后的对象中是否有名为“size”的属性?请检查数据结构 mbostock.github.io/d3/talk/20111018/flare.json 你最好在这里发布你的整个json代码。 - Anderson


答案:


将嵌套转换为树形图的最佳方法是使用指定子访问器函数 Treemap.children()

在zoomable treemap示例中,它不仅需要“children”,还需要“name”和“size”。你可以这样做:

1)更改这些属性的访问者功能,以便继续使用“key”和“value”。

让我们改变 源代码

1.1)第79和86行:

 .style("fill", function(d) { return color(d.parent.name); });

 .text(function(d) { return d.name; })

将“.name”替换为“.YOUR_NAME_KEY”(即“.key”)

 .style("fill", function(d) { return color(d.parent.YOUR_NAME_KEY); });

 .text(function(d) { return d.YOUR_NAME_KEY; })

1.2)第47行:

var treemap = d3.layout.treemap()
.round(false)
.size([w, h])
.sticky(true)
.value(function(d) { return d.size; });

附加一行来指定子访问函数。(即“.values”)

var treemap = d3.layout.treemap()
.round(false)
.size([w, h])
.sticky(true)
.value(function(d) { return d.YOUR_SIZE_KEY; })
.children(function(d){return d.YOUR_CHILDREN_KEY});

1.3)第97和51行:

function size(d) {
  return d.size;
}

将“.size”替换为“.YOUR_SIZE_KEY”(您在生成的JSON中未提及)

function size(d) {
  return d.YOUR_SIZE_KEY;
}

附:也许省略了一些东西,你需要自己验证一下。

2)转换您的JSON结构以适应示例 Array.map()


8
2017-07-02 06:57



是的我想知道如何做1)更改可缩放树形图以使用键和值而不是名称和子项。我的数据很大,我不想解析结构只是为了改变标签。 - user2457956
非常感谢,这真的很有帮助。虽然我无法让它完美地工作jsfiddle.net/bvPUg/7。名字没有显示。 - user2457956
因为你的一些数据没有“密钥”,但他们的父母却没有。看到 jsfiddle.net/e9Ceb - Anderson
哦,是的。我正在玩数据以使其更小。谢谢。很好的帮助 - user2457956
我试着效仿这个 链接,我想我差不多了,但我似乎无法得到结果。它可能非常明显,但我已经盯着它看了太长时间......链接。任何想法/指针非常感谢! - eoin


我完全同意@Anderson这个问题的最简单方法是使用树形图 children(function) 和 .value(function) 用于指定嵌套数据集中的属性名称的方法。

但是,一个 最近发布了重复的问题 提问者特意请求帮助使用 Array.map 做法。所以这里是:

排列 map(function) 方法 创建一个新数组,其中数组中的每个元素都是在原始数组的每个元素上运行指定函数的结果。具体来说,该函数最多使用三个参数运行:原始数组中的元素,该元素的索引以及整个原始数组。出于操作属性名称的目的,我们只需要第一个参数。

原始帖子中的嵌套数据有三个级别,相当于三个关键功能。因此,我们需要一个三级映射函数:

var treeData= { "key": "World", "values": 
        d3.nest()
        .key(function (d) { return d.Major_Region; })
        .key(function (d) { return d.Region; })
        .key(function (d) { return d.Country; })
        .entries(pop)
      };

var treeData2 = { "name": "World", "children":
        treeData.values.map( function(major){

            return { "name": major.key, "children": 
              major.values.map( function(region){

                 return { "name": region.key, "children": 
                   region.values.map(function(country){

                      return { "name": country.key, "children": country.values };

                   }) //end of map(function(country){
                 };

              }) //end of map(function(region){
            }; 

         }) //end of map(function(major){
      }; //end of var declaration

您也可以使用递归函数来实现它,如果您有更多级别的嵌套,这将特别有用。


5
2018-04-29 15:43



这对我有用。 - Envil
这对我不起作用!当我将treeData2传递给我的parition节点函数时,我的浏览器崩溃了!任何帮助将不胜感激..在Firefox中我得到一个Out Of Memory例外! - Ciwan
听起来你的树形结构中有一个循环。除此之外,我没有足够的信息来帮助你。 - AmeliaBR
我已经使用过这个解决方案并且它对我有用,但我也在离开节点上进行计数。不幸的是,它也标记为儿童,而我希望有一个不同的标签大小。我在这里发帖了,你能不能帮帮我.. stackoverflow.com/questions/35120044 - user3050590
为我工作。精彩回答,谢谢! - Metin Dagcilar


嘿伙计们,我想我找到了一个相当简单的解决方案。我以非常精简的方式为分层条形图完成了一个非常好的大数据集(400,000行)嵌套。它利用了Underscore库和一个附加功能_.nest。 只需下载并包含必要的两个库

“下划线-min.js” “underscore.nest.js”

然后使用_.nest函数创建结构。这是我的路线:

var newdata = _.nest(data, ["Material", "StudyName"]);

“Material”和“StudyName”是我想要将结构分组的列。

如果你需要完成更多的事情,还有其他选项可以使用这个功能,但我会这样做


0
2017-10-22 14:28