D3 - 如何处理JSON数据结构?

Ray*_*Ray 36 javascript svg json d3.js

我是D3的新手,花了几个小时才找到处理结构化数据的任何事情,但没有积极的结果.我想使用下面的数据结构创建一个条形图.条形图(水平)绘制,但仅适用于用户"jim".

var data = [{"user":"jim","scores":[40,20,30,24,18,40]},
            {"user":"ray","scores":[24,20,30,41,12,34]}];

var chart = d3.select("div#charts").append("svg")                                   
              .data(data)
              .attr("class","chart")
              .attr("width",800)
              .attr("height",350);

chart.selectAll("rect")    
    .data(function(d){return d3.values(d.scores);})    
    .enter().append("rect")
    .attr("y", function(d,i){return i * 20;})
    .attr("width",function(d){return d;})
    .attr("height", 20);
Run Code Online (Sandbox Code Playgroud)

谁能指出我做错了什么?

mbo*_*ock 93

当你加入数据通过为选择selection.data,你的数据数组中元素的个数应该与选择元件的数量.您的数据数组有两个元素(对于Jim和Ray),但是绑定它的选择只有一个SVG元素.您是在尝试创建多个SVG元素,还是将Jim和Ray的得分值放在同一个SVG元素中?

如果要将两个数据元素绑定到单个SVG元素,可以将数据包装在另一个数组中:

var chart = d3.select("#charts").append("svg")
    .data([data])
    .attr("class", "chart")
    …
Run Code Online (Sandbox Code Playgroud)

或者,使用selection.datum,它直接绑定数据而不计算连接:

var chart = d3.select("#charts").append("svg")
    .datum(data)
    .attr("class", "chart")
    …
Run Code Online (Sandbox Code Playgroud)

如果要为每个人创建多个SVG元素,则需要数据连接:

var chart = d3.select("#charts").selectAll("svg")
    .data(data)
  .enter().append("svg")
    .attr("class", "chart")
    …
Run Code Online (Sandbox Code Playgroud)

第二个问题是你不应该将d3.values与数组一起使用; 该函数用于提取对象的值.假设你想要每人一个SVG元素(因此,在这个例子中是两个),那么rect的数据就是那个人的相关分数:

var rect = chart.selectAll("rect")
    .data(function(d) { return d.scores; })
  .enter().append("rect")
    …
Run Code Online (Sandbox Code Playgroud)

如果您还没有,我建议您阅读以下教程:

  • 很高兴我能帮助你.如果这回答了您的问题,请添加复选标记以解决问题.谢谢! (5认同)
  • 你好,Mike,我很荣幸得到你的帮助:) 在这个例子中我想要的是获得单个 SVG 图像。看来我的错误不是使用 .data([data]),而是使用 .data(data) 。不幸的是我不能立即检查,但我今晚会检查。我之前浏览过“嵌套选择”。这似乎没有涵盖这个主题,但既然你推荐了它,我将深入研究这些教程。我会更新这篇文章。谢谢! (2认同)
  • 实际上,为了学习输入-更新-退出模式,我更喜欢 Mike 的“3 个小圆圈”,这是一个更新的教程,它使一切都非常清晰。http://bost.ocks.org/mike/circles/ (2认同)
  • @Ray 认为这可以解决您的问题吗? (2认同)