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

Javascript dc.js-如何从多个列创建行图表,javascript,d3.js,dc.js,crossfilter,Javascript,D3.js,Dc.js,Crossfilter,我需要在dc.js中创建一个行图,其中包含csv中多个列的输入。所以我需要将一列映射到每一行,将每一列的总数映射到行值。 可能有一个明显的解决办法,但我似乎找不到任何例子。 非常感谢 更新: 这是一张速写。为标准道歉 行图 第1列-----------------64(第1列总计) 第二栏--------35(第二栏总计) 第3列------------45(第3列的总数)您正在寻找堆叠行图表吗?例如,此图表的每行表示一个类别,每种颜色表示一个子类别: 不幸的是,DC.js还不支持此功能。功

我需要在dc.js中创建一个行图,其中包含csv中多个列的输入。所以我需要将一列映射到每一行,将每一列的总数映射到行值。 可能有一个明显的解决办法,但我似乎找不到任何例子。 非常感谢

更新: 这是一张速写。为标准道歉
行图
第1列-----------------64(第1列总计)
第二栏--------35(第二栏总计)

第3列------------45(第3列的总数)

您正在寻找堆叠行图表吗?例如,此图表的每行表示一个类别,每种颜色表示一个子类别:

不幸的是,DC.js还不支持此功能。功能请求位于。如果您愿意涉入一些非库代码,可以查看该问题日志中引用的示例

或者,您可以使用可堆叠的条形图。此链接似乎很好地描述了此功能的工作原理:
有趣的问题!它听起来有点像枢轴。我想到了一个使用“假组”和“假维度”的解决方案,但是有几个注意事项:

  • 它将在其他维度上反映过滤器
  • 但是,您将无法单击图表中的行以过滤任何其他内容(因为它将选择哪些记录?)
伪组构造函数如下所示:

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
返回

您可以将任意维度传递给此构造函数-它的索引内容无关紧要,因为您无法对这些行进行筛选。。。但您可能希望它有自己的维度,因此它受所有其他维度过滤器的影响。也给这个构造函数一个你想变成组的列数组,并将结果用作你的“组”

例如

完整示例如下:


(注意点击图表中的行会导致不好的结果,因为它应该过滤什么?

感谢您的快速回复,但没有即时消息,我恐怕不会。我只是想把一列变成一行,然后对5列这样做。因此,它就像设置跨多个列的维度一样。我想我可以破解它来创造它,但我不知道从哪里开始。我可以为每列创建5个单独的行图表,然后将它们放在彼此的上方,使其看起来像所有的一个图表,但是我必须管理最大比例。我很难看到您需要的内容。你能提供一个例子或模型图片吗?也许你在寻找一个合成图?我试着用更多的信息来更新它,希望能有所帮助。我不确定复合图表是否与行图表配合使用,但你能改变数据的结构吗?而不是有{成本:1,收入:2,间接费用:3}你能做它[{金额:1,类别:'成本'},{金额:2,类别:'收入'},{金额:3,类别:'间接费用'}];一旦做了此更改,您就可以使用带有类别维度和reduceSum组的标准行图表。我最初尝试过此方法,但我有很多不同的行图表遵循此模式(到目前为止有4个),因此跨多个交叉过滤器调用更新时会产生混乱。我已经得到了两种不同的数据结构,其中一行有一个月版本,我通过一个unqiue id更新它们。我认为这并没有简单的解决方案,所以我想你们的选择是1)合成图,2)堆叠图,3)更改数据结构。合成图听起来最适合你。构建“列”图表后,可以使用组合图表将它们组合成一个图表。但是,您可能需要手动管理行间距和偏移,以便在合并图表时,行不会相互重叠。可能更好的名称是
rotate
而不是
regroup
这对我来说非常有效。非常感谢。为了防止过滤,我找到了另一个有人发布的解决方案。对于您的代码,需要添加sidewaysRow.filter=function(){}。这将防止过滤器“坏”嗨,戈登,我需要从这个函数计算平均值。我通常在价值评估师那里做这件事,在这种情况下我该怎么做?非常感谢我将尝试在中回答这个问题,感谢您将其作为一个单独的问题提出。请注意允许对行进行筛选的后续操作:
var dim = ndx.dimension(function(r) { return r.a; });
var sidewaysGroup = regroup(dim, ['a', 'b', 'c', 'd']);