Crossfilter 维度:如何从静态 data/json 列而不是特定变量创建维度?
Crossfilter dimension: How to create dimension from static data/json columns instead of particular variables?
假设我有以下数据结构:
[
{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 对它们进行分组?即,如果我想按 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);
谢谢!
因此,这是您的 Codepen 的更新版本,它运行并将每一列聚合成 dc.js 可以理解的组格式,并将其显示为饼图:http://codepen.io/anon/pen/bEXbyW
关键点是您需要使用自定义缩减器将所有值聚合到一个组中
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 }
});
然后您需要创建一个 returns 格式为 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();
假设我有以下数据结构:
[
{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 对它们进行分组?即,如果我想按 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);
谢谢!
因此,这是您的 Codepen 的更新版本,它运行并将每一列聚合成 dc.js 可以理解的组格式,并将其显示为饼图:http://codepen.io/anon/pen/bEXbyW
关键点是您需要使用自定义缩减器将所有值聚合到一个组中
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 }
});
然后您需要创建一个 returns 格式为 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();