D3:嵌套并排除某些键

D3: Nest and excluding certain keys

本文关键字:排除 嵌套 D3      更新时间:2023-09-26

我是d3的新手,正试图在一个框中为四个特定州中的每一个绘制一些数据,与本页类似,但州不是大陆,还有更多的数据点。我有一个json数据集,其中包含42000多个条目,据称仅来自这4个状态。

为了按状态键入,我使用了以下内容:

d3.json("data/business.json",function(json) {
  var data=d3.nest()
    .key(function(d) {return d.state;})
    .sortKeys(d3.ascending)    
    .entries(json);

然后为每个状态制作一个框:

  // One cell for each state
  var g=svg.selectAll("g").data(data).enter()
    .append("g")

(属性等)

很好,但我很快发现数据集包含了一些来自我不想考虑的几个州的数据,所以它绘制的方框比我想要的要多。

我想要一种在不更改原始数据文件的情况下排除不在四个状态中的数据的方法。对此,最好的方法是什么?

过滤json:

var keep = ["state1", "state2", "state3", "state4"];
json = json.filter(function(d) { return keep.indexOf(d.state) > -1; });

可以过滤d3.nest的输出,而不是原始数组:

  function trim(nested, f) {
    return nested
        .filter(function (e) {
          return f(e.key)
        })
        .map(function (e) {
          if (e && (typeof e =='object') && Array.isArray(e.values) && ('key' in e)) {
            return { key: e.key, values: trim(e.values, f)}
          }
          else return e
        })
  }

例如:

  function isNewEngland(st) {
      return ["ME","VT","NH","MA", "CT", "RI"].indexOf(st)>=0 
  }
  data = trim(data, isNewEngland)