javascript - 使用多维数组/嵌套 json 文件创建 d3 水平条形图

标签 javascript arrays json d3.js appendchild

我正在尝试使用以下嵌套 json 文件创建一个简单的 d3 条形图 ( http://bost.ocks.org/mike/bar/2/ )。

 {
 "clustername": "cluster1",
 "children": [
 {
 "neighborhoodname": "Shaw",
 "children": [
    {

    "totpop2000": "1005",
    "children": [
    {
        "name": "demographic",
        "children": [
        {"name": "Black", "size2000":0.18},
        {"name": "White", "size2000":0.6},
        {"name": "Hispanic", "size2000":0.40},
        {"name": "Asian", "size2000":0.10}
        ]
        },
    {
        "name": "wellbeing",
        "children": [
        {"name": "Unemployment", "size2000":0.40},
        {"name": "Poverty", "size2000":0.1},
        {"name": "Without HS Education", "size2000":0.31}
        ]
        },
    {
        "name": "crime",
        "children": [
        {"name": "Violent Crime", "size2000":0.09},
        {"name": "Property Crime", "size2000":0.08}
        ]
        },
    {
        "name": "housing",
        "children": [
        {"name": "Home Ownership", "size2000":0.34},
        {"name": "Houses for Rent", "size2000":0.50}
        ]
    }
   ]
   }
  ]
  }
 ]
}

到目前为止,我的 JavaScript 包含以下内容,用于将标记为 size2000 的金额添加到 svg,但是当我运行代码时,我似乎无法附加适当的数据数组(即我得到我的 json 文件中的第一个数组/"clustername": "cluster1")。

var data = d3.json("data/test.json", function(json) {
	console.log(json); 

	   
var bar = chart2000.selectAll("g")
      .data(data)
    .enter().append("g")
      .attr("transform", function(d, i) { return "translate(0," + i * height + ")"; });

  bar.append("rect")
      .attr("width", function(d) { return x((d.size2000)*100); })
      .attr("height", height - 1);

  bar.append("text")
      .attr("x", function(d) { return x((d.size2000)*100) - 3; })
      .attr("y", height / 2)
      .attr("dy", ".35em")
      .text(function(d) { return (d.size2000)*100); });

});

有没有办法保留 json 数据结构并将 size2000 值附加到 svg?如果是这样,怎么办?

最佳答案

使用 D3 进行可视化的基本原则之一是 DOM 中数据和元素之间的对应关系。映射还应该尊重数据和 DOM 节点的层次结构,尽管这不是严格要求。因此,如果数据是嵌套的,可视化也应该以某种方式嵌套(例如按层次结构划分的多个条形图)。从另一个方向进行类比,如果您想要一个平面条形图,那么数据也应该是一个平面值列表。

它不必是扁平的,但它会使实现和 DOM 映射更容易。我会将您手动为条形图获取的 json 数据映射到平面列表中:

d3.json("data/test.json", function(json) {

    var barChartData = [];
    function addLeaves(node) {
        if (typeof node.children !== "undefined") { 
            node.children.forEach(addLeaves); 
        } else { 
            barChartData.push(node); 
        }
    }
    addLeaves(json);

    var bar = chart2000.selectAll("g")
              .data(barChartData)
    // ...
}

关于javascript - 使用多维数组/嵌套 json 文件创建 d3 水平条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963668/

相关文章:

Javascript Date() 毫秒差不相加

javascript - 如果依赖输入中的值不是手动更改,则 Jquery 输入值不会更改

javascript - 更改 DOM 元素的 insideText 是否会导致新的布局计算/渲染?

javascript - 如何使用 TinyMCE 粘贴插件允许 HTML 标签?

python:合并 SQLITE 表的列表列表

arrays - 用其他数组替换部分数组的最简单方法? (将二进制数据修补到文件中)

python - protobuf MessageToJson 删除值为 0 的字段

javascript - 发布到GEOJSON Google 将数据映射到我的远程服务器上的 json 文件

javascript - D3 : ordinal scale not working with array of objects

php - 计算 API JSON 响应中的数组