如何在dc.js中为多标签数据制作行图

How to make row chart for multilabel data in dc.js

本文关键字:数据 标签 dc js      更新时间:2023-09-26

我有一列数据,这是每个数据点的标签列表。我想用dc.js制作一个行图,绘制每个标签的出现次数。

数据如下:

日期,标签
2015年1月1日,"A、B、C"
2015年1月2日,"B"
2015年1月3日,"C,A"
2015年1月4日,"A"

我想要一个这样聚合它们的折线图:
A: 3
B: 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来完成此操作,并自行管理分组。如果你把一个工作例子和你的维度放在一起,我可以向你展示如何做到这一点。

然而,你有没有看过Redutio,它让这件事变得很容易?https://github.com/esjewett/reductio#groupall-聚合

使用您的数据,您可以执行类似的操作

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"

工作示例:https://jsfiddle.net/z4k78odx/4/