【问题标题】:dc.js: Boxplot with nested groupingdc.js:带有嵌套分组的箱线图
【发布时间】:2017-07-15 12:57:43
【问题描述】:

我一直在使用 dc.js/crossfilter.js 并遇到了一个我无法解决的问题。我的数据坚持这种模式:

[2016-02-01, "Lorem ipsum", -45] [2016-02-03, "Lorem ipsum", 34] [2016-03-04, "Lorem ipsum", 101] ...

所以基本上是一个时间序列,每天都有一个数值。我想做的:用一个盒子画一个箱线图,显示月份总和的中位数等(即一个月的总和由一个点反映,胡须显示所有月份的分位数) .这意味着我必须按月分组/求和才能首先获得这些值:

[2016-02, 79] [2016-03, 101] ...

我不知道如何在 dc.js 中做到这一点 - 如果我按月分组然后将其用于我的箱线图,我每月会得到一个盒子,并且这些措施是指个人条目。这对 dc.js 的框架很有意义,但这不是我想要的。

关于如何做到这一点的任何想法?感谢您的帮助!

最好的问候

编辑:

【问题讨论】:

    标签: javascript dc.js crossfilter


    【解决方案1】:

    是的,箱线图期望 group.all() 返回一个键/值对数组,其中值是一个数字数组。

    当您需要为图表重塑交叉过滤器数据时,fake group 是目前最好的技术。这是一个实现 dc.js 使用的唯一方法的对象,(*)group.all(),从交叉过滤器组中提取数据:

    function one_bin(group, key) {
      return {
        all: function() {
          return [{
            key: key,
            value: group.all().map(kv => kv.value)
          }];
        }
      };
    }
    

    one_bin 采用原始组和键名;它生成一个包含一个键/值的数组,其中键是键名,值是原始组中所有值的数组。

    one_bin 包装您的原始组并将其传递给箱线图:

    var box = dc.boxPlot('#box')
      .width(200).height(500)
      .dimension(monthDim) // this is actually wrong but can't brush anyway
      .group(one_bin(monthGroup, 'all months'))
    ;
    

    当然,刷牙是行不通的,但对于这张图表的 x 维度,它只会是全有或全无。

    小提琴示例:https://jsfiddle.net/q8m54cg3/15/

    (*) 从 dc.js 2.1 开始; 2.0及以下也使用group.top(N)

    【讨论】:

    • 谢谢!一旦有机会在我的数据上进行尝试,我会尽快回复您。
    • 所以 - 箱线图呈现,但看起来有点不对劲。胡须不见了(见原帖中的图片)。知道为什么吗?
    • 你是否包含了 dc.css?看起来样式搞砸了(我的小提琴没问题)。
    • dc.css 被包括在内,但是一个相当旧的版本。我把它换成了现在的,现在看起来很好。感谢你的帮助!顺便说一句,dc.js 做得很好 - 非常酷的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2019-10-17
    • 2021-08-28
    • 2016-09-14
    • 2013-05-11
    相关资源
    最近更新 更多