如何在dc.js中绘制非线性数据

时间:2018-05-17 10:32:13

标签: dc.js crossfilter

我有一个json数据文件,其结构有点复杂,类似:

[
  {
    "patient_id": "f1ff9870",
    "demographics": {
      "gender": "female",
      "age": 78
    },
    "measurements": [
      {
        "unit": "bpm",
        "kind": "pulse",
        "value": "130",
        "measurementDate": "2017-05-04 03:00:00+03"
      }
    ],
    "problems": [
      {
        "name_title": "problem1",
        "category": "Primary disease",
        "startDate": "2017-05-12 03:00:00+03"
      },
      {
        "name_title": "problem2",
        "category": "Primary disease",
        "startDate": "2017-05-12 03:00:00+03"
      }
    ]
  },
  {
    "patient_id": "c9047712",
    "demographics": {
      "gender": "male",
      "age": 60
    }
  }
]

每个对象都是一个可以拥有多个字段的患者,其中一些是数组,并非所有患者都有相同数量的字段。

我正在尝试找到一种方法来使用交叉过滤器并为图表制作组,但我并不是真正接近解决方案。我想为每个字段使用图表(即问题,年龄等),每个字段都应该是一个过滤器。因此,如果我选择一个特定的问题,我将能够看到有多少患者有这个问题,他们的年龄,测量等。有没有办法解决非线性数据?

1 个答案:

答案 0 :(得分:0)

这是一个广泛的问题。让我谈谈这个具体部分:

  

如果我选择一个特定的问题,我将能够看到有多少患者有这个问题,他们的年龄,测量等。

“问题”可以被视为tag or array dimension

所以你可以汇总问题和这样的年龄:

var cf = crossfilter(data);
var problemsDim = cf.dimension(d => d.problems.map(p => p.category), true);
var ageDim = cf.dimension(d => d.demographics.age);
var problemsGroup = problemsDim.group(); // default is "reduceCount"
var ageGroup = ageDim.group();

现在,当您选择特定问题时,您将看到所有患有该问题的患者的计数。当您选择特定年龄时,您将获得所有患有此问题的患者的计数。

请注意,对于标记维度,所有计数的总和通常总计超过记录数。

您可以为测量做类似的事情。当然,有些患者可能没有问题或测量,因此他们不会出现在这些图表中。如果患者有多个相同的测量结果,您最终可能会得到奇怪的结果。