【问题标题】:D3: Nest and excluding certain keysD3:嵌套并排除某些键
【发布时间】:2014-09-25 09:21:43
【问题描述】:

我是 d3 的新手,并试图在一个框中为四个特定州中的每一个绘制一些数据,类似于 this page 但州不是大陆,还有更多数据点。我有一个包含 42,000 多个条目的 json 数据集,据说来自这 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")

(属性等)

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

我想要一种在不更改原始数据文件的情况下排除不属于四种状态的数据的方法。解决此问题的最佳方法是什么?

【问题讨论】:

    标签: javascript json d3.js


    【解决方案1】:

    过滤您的json

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

    【讨论】:

    • 是的!你能告诉我为什么同一行不适用于 json = json.filter(function(d) { return keep.contains(d.state); });说不是函数。那不是有效的JS吗?
    • @punstress array.contains() 不是有效的 JavaScript。 Here 是一个相关的 SO 问题。
    • 不知道为什么我发现 contains() 如果它不是一种方法。 ://
    【解决方案2】:

    可以过滤来自 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 2020-08-29
      • 2016-07-05
      • 2021-10-30
      • 2014-07-23
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多