我有以下CSV:
ccgcode,ccgname,metric,male,female
06M,Great Yarmouth And Waveney,3,24,76
05G,North Staffordshire,3,46,54
... etc.
如何创建Sex
维度来推动dc.pieChart()
?我的问题具体是关于Crossfilter的Dimension
和Group
方面,而不是如何渲染饼图。
答案 0 :(得分:2)
Crossfilter不能简单地总结您需要的两个列,因此重新格式化数据是您最好的选择(根据评论中的对话)。如果您熟悉R,则可以使用melt.js,其工作方式与reshape类似,因此您无需触摸原始数据。
此解决方案假设您的数据是具有键值对的对象列表(非常标准):
data = [
{ ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3, male: 24, female: 76 },
{ ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3, male: 46, female: 54 },
...];
您首先想要识别您不想要的所有静态列"融化" (集计):
var staticColumns = ['ccgcode', 'ccgname', 'metric'];
然后使用melt
取消组合男性和女性列。 Melt
会收集您的数据,您不想融化的列以及新熔体列的名称(在您的情况下是sex
):
var ndx = crossfilter(melt(data, staticColumns, 'sex', 'count'));
var sexDim = ndx.dimension(function (d) { return d.sex; });
您最终得到以下维度:
sexDim = [
{ sex: 'male', count: 24, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 },
{ sex: 'male', count: 46, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3},
{ sex: 'female', count: 76, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 },
{ sex: 'female', count: 54, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3},
...];
请注意_id
为您创建的有用的melt
,以防您需要将所有内容重新组合在一起(尽管您的静态列也有助于此)。您可以将false
作为第五个参数传递给melt
,以排除_id
属性。
你仍然可以按性别分组:
var males = sexDim.group().reduceSum(function (d) {
if (d.sex === 'male') {
return d.count;
} else {
return 0;
}
});
希望有所帮助!