访问嵌套数据而不附加 d3.js

Access nested data without appending in d3.js

我很难理解嵌套选择的工作原理。我寻找了类似的问题,但 none 考虑一个案例,您 访问嵌套数据只是为了设置属性 ,而不附加任何内容。

我想在水平条形图中显示每年陨石着陆的数量: 每年一个矩形,宽度等于当年坠落的陨石数量。

这是数据格式(csv):

name,id,nametype,recclass,rectype,mass,fall,year,reclat,reclong,GeoLocation
Renazzo,22586,Valid,CR2,Stony,1000,Fell,1824,44.76667,11.28333,"(44.76667, 11.28333)"
Tounkin,24037,Valid,OC,Stony,2000,Fell,1824,51.73333,102.53333,"(51.73333, 102.53333)"
Zebrak,30397,Valid,H5,Stony,2000,Fell,1824,49.88333,13.91667,"(49.88333, 13.91667)"

在这种情况下,例如,我应该得到一个长度为 3 的柱。

首先,我通过嵌套按年份对数据进行分组:

var dataByYear = d3.nest()
    .key(function(d) {
        return d.year;
    })
    .entries(data);

我不使用汇总,因为我需要保留这些值并在以后访问它们(我需要名称、名称类型、年份和质量)。

生成的数组如下所示:

然后我画矩形:

barSvg.selectAll("rect")
    .data(dataByYear).enter().append("rect")
    .attr("x", 10)
    .attr("y", function(d, i) {
        return i * 23;
    })
    .attr("height", 10)
    .selectAll("rect")
    .data(function(d, i) {
        return d;
    }).enter()
    .attr("width", function(d) {
        return d.year.lenght;
    });

控制台不显示错误消息,绘制了所有矩形,但不显示其高度属性。

有人可以告诉我我在这里缺少什么吗?

首先,在 "enter" 选择中再次使用 data()enter() 是没有意义的。摆脱那个。

在您的输入选择中,每个数据都有一个 key 属性 和一个 values 属性。获取当年坠落陨石数量的方法很简单,就是用values.length.

这是一个使用您的数据的演示(将呈现单个矩形):

var csv = `name,id,nametype,recclass,rectype,mass,fall,year,reclat,reclong,GeoLocation
Renazzo,22586,Valid,CR2,Stony,1000,Fell,1824,44.76667,11.28333,"(44.76667, 11.28333)"
Tounkin,24037,Valid,OC,Stony,2000,Fell,1824,51.73333,102.53333,"(51.73333, 102.53333)"
Zebrak,30397,Valid,H5,Stony,2000,Fell,1824,49.88333,13.91667,"(49.88333, 13.91667)"`;

var svg = d3.select("svg");

var data = d3.csvParse(csv);
var dataByYear = d3.nest()
  .key(function(d) {
    return d.year;
  })
  .entries(data);

var rects = svg.selectAll(null)
  .data(dataByYear)
  .enter()
  .append("rect")
  .attr("x", 10)
  .attr("y", function(d, i) {
    return i * 23;
  })
  .attr("height", 10)
  .attr("width", function(d) {
    return d.values.length * 10
  })
<script src="https://d3js.org/d3.v4.js"></script>
<svg></svg>