【问题标题】:dc.js - how to create a row chart from multiple columnsdc.js - 如何从多列创建行图
【发布时间】:2014-09-04 09:55:21
【问题描述】:

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

更新: 这是一个快速草图。为标准道歉
行图;
第 1 列 ----------------- 64(第 1 列的总数)
第 2 列 ------- 35(第 2 列的总数)
column3 ------------ 45(第3列的总数)

【问题讨论】:

  • 你能改变你的数据结构吗?而不是有{成本:1,收入:2,间接费用:3}你能做到[{金额:1,类别:'成本'},{金额:2,类别:'收入'},{金额:3,类别:'开销'}];完成此更改后,您可以使用具有类别维度和 reduceSum 组的标准行图。
  • 我最初尝试过这个,但我有很多不同的行图遵循这种模式(到目前为止有 4 个),所以跨多个交叉过滤器的调用更新令人困惑。我已经得到了两种不同的数据结构,其中一行有一个月度版本,我通过一个 unqiue id 在它们之间进行更新。我认为没有简单的解决方案,然后我错过了
  • 我认为您的选择是 1) 复合图表、2) 堆叠图表和 3) 更改数据结构。复合图表听起来最适合您。构建“柱形”图表后,您可以使用复合图表将它们组合成一个图表。但是,您可能需要手动管理行间距和偏移量,以便在组合图表时行不会相互重叠。

标签: javascript d3.js dc.js crossfilter


【解决方案1】:

有趣的问题!这听起来有点类似于枢轴,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/

(请注意单击图表中的行会导致错误,因为它应该过滤什么?)

【讨论】:

  • 也许更好的名字是rotate 而不是regroup
  • 这对我来说非常有效。谢谢!为了防止过滤,我发现有人发布了另一个解决方案。对于您的代码,它需要添加 sidewaysRow.filter = function() {}。这将防止过滤器“坏”
  • 嗨,戈登,我需要计算这个函数的平均值。我通常在价值评估员中这样做,在这种情况下我会怎么做?非常感谢
  • 我将尝试在stackoverflow.com/q/40627538/676195 中回答这个问题,感谢您将其作为一个单独的问题提出。
  • 还要注意允许对行进行过滤的后续操作:stackoverflow.com/questions/34299017/…
【解决方案2】:

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

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

或者,您可以使用可堆叠的条形图。这个链接似乎很好地描述了它是如何工作的:http://www.solinea.com/blog/coloring-dcjs-stacked-bar-charts

【讨论】:

  • 感谢您的快速回复,但我害怕堆叠后没有。我真的只是想把一列放到一行中,然后对 5 列执行此操作。所以它就像跨多列设置维度一样。我以为我可以破解它来创建它,但我不知道从哪里开始。我也许可以为每列创建 5 个单独的行图,然后将它们放在彼此之上,使其看起来像一个图表,但是我必须管理最大比例
  • 我无法想象您需要什么。您能提供一个示例或模型图像吗?
  • 也许您正在寻找复合图表?见stackoverflow.com/questions/21961551/…
  • 我已尝试用更多信息对其进行更新,希望对您有所帮助。我不确定复合图表是否适用于行图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2014-03-09
  • 2013-01-07
相关资源
最近更新 更多