如何为 dc.js 中的多标签数据制作行图
How to make row chart for multilabel data in dc.js
我有一列数据,它是每个数据点的标签列表。我想使用 dc.js 制作一个图表,绘制每个标签的出现次数。
数据如下所示:
日期,标签
2015 年 1 月 1 日,"A, B, C"
2015 年 1 月 2 日,"B"
2015 年 1 月 3 日,"C, A"
2015 年 1 月 4 日,"A"
我想要一个像这样汇总它们的行图表:
答:3
乙:2
C: 2
到目前为止我的代码:
var labels = ["A", "B", "C"];
var labelBar = dc.rowChart("#label-bar");
d3.csv('data.csv', function (csv) {
var data = crossfilter(csv);
var labelDim = data.dimension(function(d){return d["Labels"];});
var labelGroup = labelDim.group().reduce(
function(p,v) { //add
for (i = 0; i < labels.length; i++) {
if(v["Labels"].indexOf(labels[i]) > -1)
p[labels[i]]++;
}
return p;
},
function(p,v) { //subtract
for (i = 0; i < labels.length; i++) {
if(v["Labels"].indexOf(labels[i]) > -1)
p[labels[i]]--;
}
return p;
},
function(p,v) { //initial
p = {};
for (i = 0; i < labels.length; i++) {
p[labels[i]] = 0;
}
return p;
});
labelBar
.dimension(labelDim)
.group(labelGroup)
.elasticX(true);
});
该代码只为每个数据点创建一个条形图,而不是为每个标签创建一个条形图。任何帮助将不胜感激。
为此您需要使用 dimension.groupAll 并自行管理分组。如果您将一个工作示例与您的维度放在一起,我可以告诉您如何执行此操作。
但是,您是否看过 Reductio,它使这变得非常简单? https://github.com/esjewett/reductio#groupall-aggregations
使用您的数据,您可以做类似的事情
var dim = data.dimension(function(d) { return d.Labels.split(','); });
groupAll = dim.groupAll();
reducer = reductio()
.groupAll(function(record) {
return record.Labels.split(',');
})
.count(true);
reducer(groupAll);
groupAll.all(); // Should give you groups with keys "A", "B", "C"
我有一列数据,它是每个数据点的标签列表。我想使用 dc.js 制作一个图表,绘制每个标签的出现次数。
数据如下所示:
日期,标签
2015 年 1 月 1 日,"A, B, C"
2015 年 1 月 2 日,"B"
2015 年 1 月 3 日,"C, A"
2015 年 1 月 4 日,"A"
我想要一个像这样汇总它们的行图表:
答:3
乙:2
C: 2
到目前为止我的代码:
var labels = ["A", "B", "C"];
var labelBar = dc.rowChart("#label-bar");
d3.csv('data.csv', function (csv) {
var data = crossfilter(csv);
var labelDim = data.dimension(function(d){return d["Labels"];});
var labelGroup = labelDim.group().reduce(
function(p,v) { //add
for (i = 0; i < labels.length; i++) {
if(v["Labels"].indexOf(labels[i]) > -1)
p[labels[i]]++;
}
return p;
},
function(p,v) { //subtract
for (i = 0; i < labels.length; i++) {
if(v["Labels"].indexOf(labels[i]) > -1)
p[labels[i]]--;
}
return p;
},
function(p,v) { //initial
p = {};
for (i = 0; i < labels.length; i++) {
p[labels[i]] = 0;
}
return p;
});
labelBar
.dimension(labelDim)
.group(labelGroup)
.elasticX(true);
});
该代码只为每个数据点创建一个条形图,而不是为每个标签创建一个条形图。任何帮助将不胜感激。
为此您需要使用 dimension.groupAll 并自行管理分组。如果您将一个工作示例与您的维度放在一起,我可以告诉您如何执行此操作。
但是,您是否看过 Reductio,它使这变得非常简单? https://github.com/esjewett/reductio#groupall-aggregations
使用您的数据,您可以做类似的事情
var dim = data.dimension(function(d) { return d.Labels.split(','); });
groupAll = dim.groupAll();
reducer = reductio()
.groupAll(function(record) {
return record.Labels.split(',');
})
.count(true);
reducer(groupAll);
groupAll.all(); // Should give you groups with keys "A", "B", "C"