dc.js - 从同一列的数据组创建多个图表

标签 dc.js crossfilter

如何制作这个仪表板

enter image description here

来自此数据

time,group_name,value
15/10/2017 15:36:15,group-1,1
15/10/2017 15:36:15,group-2,1
15/10/2017 15:36:15,group-2,1
15/10/2017 15:36:15,group-2,1
15/10/2017 15:36:16,group-1,1
15/10/2017 15:36:16,group-3,1
15/10/2017 15:36:16,group-1,1
15/10/2017 15:36:16,group-3,1
15/10/2017 15:36:17,group-3,1
15/10/2017 15:36:17,group-3,1
15/10/2017 15:36:17,group-1,1
15/10/2017 15:36:17,group-2,1
15/10/2017 15:36:18,group-1,1
15/10/2017 15:36:18,group-1,1
15/10/2017 15:36:18,group-2,1
15/10/2017 15:36:18,group-1,1
15/10/2017 15:36:19,group-3,1
15/10/2017 15:36:19,group-2,1
15/10/2017 15:36:19,group-2,1
15/10/2017 15:36:19,group-1,1

使用 dc.js?

提前谢谢您。

最佳答案

您可以通过首先按时间列和组列进行维度/分组,然后使用假组将一个组分成多个组来实现此目的。

我无权访问您的数据(最好在提问时将您的数据粘贴为文本),因此我使用 dc.js 示例之一的数据创建了一个示例。数据如下所示:

Expt,Run,Speed
1,1,850
1,2,740
1,3,900
1,4,1070
1,5,930
1,6,850
...
2,1,960
2,2,940
2,3,960
2,4,940
2,5,880
2,6,800

有两个重要步骤。首先,我们需要创建一个以 X 维度和分割依据维度为关键的维度和组。在本例中,我们希望 Run 为 X 维度,并且希望按 Expt 进行分割。我们将把Run放在第一位。群里一切正常。

var runExptDim = cf.dimension(function(d) {
  return [d.Run, d.Expt];
});
var runExptGroup = runExptDim.group().reduceSum(function(d) {
  return d.Speed;
});

现在我们需要一个假组来通过第二个键分割原始组。这是一个函数,它允许我们为 Expt 的所有值构造假组:

function split_group(group2d) {
  return {
    subgroup: function(key) {
      return {
        all: function() {
          return group2d.all().filter(function(kv) {
            return kv.key[1] === key;
          }).map(function(kv) {
            return {key: kv.key[0], value: kv.value};
          }).sort(function(a, b) {
            return a.key - b.key;
          })
        }
      };
    }
  };
}

当子组的 .all() 方法被调用时,它会从原始组中提取数据,使用键的第二部分过滤数据,并使用删除键的第二部分.map().

最后,它还必须对数据进行排序,因为多键往往会弄乱排序,因为当您使用多键时,数据会转换为字符串进行排序。

像这样获取子组:

var splitGroup = split_group(runExptGroup);
var runGroup1 = splitGroup.subgroup(1),
  runGroup2 = splitGroup.subgroup(2),
  runGroup3 = splitGroup.subgroup(3);

由于我们有一个奇怪的维度,因此不清楚要为图表指定什么维度。最简单的方法是在 X 轴上创建另一个维度:

var runDim = cf.dimension(function(d) {
  return d.Run;
});

但是,这将导致图表自行过滤。我稍后可能会重新审视我的答案并纠正这个问题。

图表初始化如下所示:

var line1 = dc.lineChart('#line1')
  .width(400).height(200)
  .dimension(runExptGroup)
  .group(runGroup1)
  .x(d3.scale.linear())
  .elasticX(true)
  .elasticY(true);

这并不能满足您的造型需求,但您可以查看sparkline example那里有一些提示。

这是一个 fiddle 示例:https://jsfiddle.net/gordonwoodhull/og68rkqz/

希望这有帮助!

编辑:在数字显示中显示总计

要显示每个拆分组的总计,您可以创建一个“假 groupAll”,它采用 value 的总和:

  function total_group(group) {
    return {
      value: () => d3.sum(group.all(), kv => kv.value)
    };
  }

数字显示可以采用带有 .total() 方法的 groupAll 对象或常规组,在这种情况下,它将找到 .all() 的最大值>

奇怪的是,在使用 groupAll 时它需要身份值访问器。把它们放在一起:

  var identity = x => x;
  
  var number1 = dc.numberDisplay('#num1')
    .valueAccessor(identity)
    .group(total_group(runGroup1));

你的 fiddle fork :https://jsfiddle.net/gordonwoodhull/aj1m9ysg/1/

关于dc.js - 从同一列的数据组创建多个图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46757188/

相关文章:

javascript - 在 Angular 应用程序中加载完成后如何停止旋转器?

javascript - Dc.js 刷机滞后。与 dc.js 版本 1.3 不同,过滤多次

javascript - dc.js 和 crossfilter - 根本不读取 json

javascript - dc.js 某些数据值未显示

javascript - dc.js - 显示值,而不是reduceSum 或reduceCount

javascript - 具有单个键的多个值的 dc.js 散点图

javascript - 从 dc.js 图表访问过滤/剪辑数据

javascript - Dc-sunburst、dc-Menuslect、dc-非交互图

javascript - dc.js x 轴默认域 - 奇怪的结果

javascript - DC.js 等值线 map CSS 与颜色冲突,没有 map 显示。如何关闭填充:none?