dc.js-如何从多列创建行图

问题描述 投票:3回答:2

我需要在dc.js中使用来自csv中多列的输入来创建一个行图。所以我需要将一列映射到每一行,并将每一列的总数映射到行值。可能有一个明显的解决方案,但我似乎找不到任何示例。非常感谢S

更新:这是一个简单的草图。为这个道歉行图;第1列----------------- 64(第1列的总计)第2列------- 35(第2列的总计)第3列------------ 45(第3列的总计)

javascript d3.js dc.js crossfilter
2个回答
5
投票

有趣的问题!听起来有点像枢轴requested for crossfilter here。使用“假组”和“假尺寸”可以想到一个解决方案,但是有一些警告:

  • 它将反映其他尺寸的过滤器
  • 但是,您将无法单击图表中的行以过滤其他任何内容(因为它将选择哪些记录?)

伪造的组构造函数看起来像这样:

function regroup(dim, cols) {
    var _groupAll = dim.groupAll().reduce(
        function(p, v) { // add
            cols.forEach(function(c) {
                p[c] += v[c];
            });
            return p;
        },
        function(p, v) { // remove
            cols.forEach(function(c) {
                p[c] -= v[c];
            });
            return p;
        },
        function() { // init
            var p = {};
            cols.forEach(function(c) {
                p[c] = 0;
            });
            return p;
        });
    return {
        all: function() {
            // or _.pairs, anything to turn the object into an array
            return d3.map(_groupAll.value()).entries();
        }
    };
}

[这是将所有请求的行都减少到一个对象,然后将该对象转换为dc.js期望group.all返回的数组格式。

您可以将任何任意维度传递给此构造函数-索引的内容无关紧要,因为您不能在这些行上进行过滤...但是您可能希望它具有自己的维度,因此它会受到所有其他维度的影响过滤器。还给此构造函数一个您希望将其分成组的列数组,然后将结果用作“组”。

例如

var dim = ndx.dimension(function(r) { return r.a; });
var sidewaysGroup = regroup(dim, ['a', 'b', 'c', 'd']);

完整示例在这里:https://jsfiddle.net/gordonwoodhull/j4nLt5xf/5/

(注意单击图表中的行会导致不良,因为它应该过滤什么?]


1
投票

您是否正在寻找堆积的行图?例如,此图表的每一行代表一个类别,每种颜色代表一个子类别:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9rTnNEUy5wbmcifQ==” alt =“在此处输入图像描述”>

[遗憾的是,DC.js尚不支持此功能。功能请求位于https://github.com/dc-js/dc.js/issues/397。如果您愿意涉入某些非库代码,则可以查看该问题日志中引用的示例。

或者,您可以使用可堆叠的条形图。该链接似乎很好地描述了它的工作方式:http://www.solinea.com/blog/coloring-dcjs-stacked-bar-charts“在此处输入图像描述”

© www.soinside.com 2019 - 2024. All rights reserved.