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

IT技术 javascript d3.js dc.js crossfilter
2021-02-04 16:09:36

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

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

2个回答

有趣的问题!这听起来有点类似于一个枢轴,在此处用于交叉过滤器我想到了使用“假组”和“假维度”的解决方案,但是有几个注意事项:

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

假组构造函数如下所示:

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
2021-03-15 16:09:36
这对我来说非常有效。谢谢!为了防止过滤,我找到了有人发布的另一个解决方案。对于您的代码,它需要添加 sidewaysRow.filter = function() {}。这将防止过滤器“不良”
2021-03-30 16:09:36
嗨戈登,我需要从这个函数计算平均值。我通常在value评估器中执行此操作,在这种情况下我将如何执行?非常感谢
2021-04-07 16:09:36
我会尝试在stackoverflow.com/q/40627538/676195 中回答这个问题,感谢您将其作为单独的问题提出。
2021-04-08 16:09:36
还要注意允许对行进行过滤的后续操作:stackoverflow.com/questions/34299017/...
2021-04-09 16:09:36

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

在此处输入图片说明

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

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

我已经尝试用更多信息更新它,希望它有所帮助。我不确定复合图表是否适用于行图
2021-03-20 16:09:36
也许您正在寻找复合图表?参见stackoverflow.com/questions/21961551/...
2021-03-23 16:09:36
感谢您的快速回复,但我害怕堆叠后没有我。我真的只是想将一列变成一行,然后对 5 列执行此操作。所以它就像跨多列设置维度一样。我以为我可以破解它来创建它,但我不知道从哪里开始。我也许可以为每一列创建 5 个单独的行图,然后将它们放在彼此之上,使其看起来像所有一个图表,但随后我必须管理最大比例
2021-03-29 16:09:36
我很难想象你需要什么。你能提供一个例子或模型图像吗?
2021-03-30 16:09:36