Crossfilter 交叉过滤维度:如何从静态数据/json列而不是特定变量创建维度?

Crossfilter 交叉过滤维度:如何从静态数据/json列而不是特定变量创建维度?,crossfilter,Crossfilter,假设我有以下数据结构: [ {columnA: 1, columnB: 2, columnC: 3}, {columnA: 4, columnB: 5, columnC: 6}, {columnA: 7, columnB: 8, columnC:9} ] 通常根据一列定义尺寸: var dimensionA = myCrossFilter.dimension(function(row) { return row.columnA; }) 小组讨论: dc.pie

假设我有以下数据结构:

[
    {columnA: 1, columnB: 2, columnC: 3},
    {columnA: 4, columnB: 5, columnC: 6},
    {columnA: 7, columnB: 8, columnC:9}
]
通常根据一列定义尺寸:

var dimensionA = myCrossFilter.dimension(function(row) {
    return row.columnA;
})
小组讨论:

dc.pieChart("#chart")
    .dimension(dimensionA )
    .group(dimensionA.group )
    .xAxis().ticks(3);
如何定义维度并根据不同的列使用crossfilter/DC对其进行分组?i、 e.如果我想分组并按columnA、columnB和columnC显示饼图

更新:当我循环遍历数据时,我可以得到每列的总和:

var a =0, b=0, c=0;
dataSet.forEach(function(d) {
 a += d.a;
 b += d.b;
 c += d.c;
}

如何使用上述静态数据绘制图表,如下所示:

dc.pieChart("#chart")
    .dimension(["A", "B", "C"] )
    .group([12, 15, 18] )
    .xAxis().ticks(3);

谢谢

下面是代码笔的更新版本,它运行并将每个列聚合为dc.js可以理解的组格式,并将其显示为饼图:

关键的一点是,您需要使用一个自定义的缩减器将所有值聚合到一个组中

speedSumGroup = runDimension.group().reduce(function(p,d) {
      p.a += d.A;
      p.b += d.B;
      p.c += d.C;
      return p;
    }, function(p,d) {
      p.a -= d.A;
      p.b -= d.B;
      p.c -= d.C;
      return p;
    }, function() {
      return { a: 0, b: 0, c:0 }
    });
然后需要创建一个假组,该组返回dc.js构建饼图所需的格式

var fakeGroup = {
  all: function() { return [
    { key: "A", value: speedSumGroup.top(1)[0].value.a },
    { key: "B", value: speedSumGroup.top(1)[0].value.b },
    { key: "C", value: speedSumGroup.top(1)[0].value.c }
  ]; }
}

chart
    .dimension(runDimension)
    .group(fakeGroup);
如上所述,如果您打算使用这些库,我强烈建议您将数据转换为一种更适合dc.js和Crossfilter的格式,而不是通过这些技巧来让数据工作。正确转换数据可以得到更简单的结果:

var chart = dc.pieChart("#test");
var data = [ 
    {A: 1, B: 2, C: 3},
    {A: 4, B: 5, C: 6},
    {A: 7, B: 8, C:9}
];

var newData = [];

data.forEach(function(d) {
  for(key in d) {
    newData.push({ name: key, value: d[key] });
  }
});

var ndx = crossfilter(newData);
var dim = ndx.dimension(function(d) { return d.name; });
var grp = dim.group().reduceSum(function(d) { return d.value; });

chart
    .dimension(dim)
    .group(grp);

  chart.render();

转换后的示例:

我不清楚这对这3列进行分组意味着什么。他们的总数是多少?根据您在示例中提供的数据,您能否在问题中描述您希望看到的情况以及小组的样子?很抱歉,因为我正在学习该程序包。我想要一个基于3列总数的pieChart拆分。在上面的示例中,pieChart将有3个切片,A(12)、B(15)、C(18)。我建议您将数据转换为类似{columnName:“A”,value:1}的记录结构,然后对其使用交叉过滤器。您的维度将是columnName,您的组将是dimension.group().reduceSum(函数(d){return d.value;}),我试图避免这种情况,因为数据结构比这稍微复杂一些。我更新了上面的问题。也许现在更容易了?您可以使用一个自定义的缩减器将a、b和c全部聚合到同一个组中,然后构建一个假组以提供给DC.js。一般来说,如果可能的话,我建议在使用之前进行数据转换。谢谢你的回答。一旦我看到您的代码,很明显转换数据会更容易。关键在于,使用一个数据源,用户可以单击一个图表,其他图表将根据场景后面的过滤器自动更新。当使用单独的“newData”时,当点击piechart时,我需要捕获事件并更新原始“data”源并重新绘制其他图表。再次感谢!酷:-)如果您也可以使用转换后的数据运行其他图表,那么dc.js将处理更新。否则,是的,您将需要捕获事件并自己处理更新。@EthanJewett您是否有在这种情况下如何处理更新的示例?我想用它来创建一个总饼图,但希望当原始数据发生变化(原始未转换数据)时,这个总饼图(预转换数据)会做出响应,我不确定是否遵循。把一个简单的例子和一个新问题放在一起可能有意义。@EthanJewett我指的是你评论中的最后一句话:
否则,是的,你需要捕获事件并自己处理更新。