首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从同一列的数据组创建多个图表

从同一列的数据组创建多个图表
EN

Stack Overflow用户
提问于 2017-10-15 16:16:44
回答 1查看 563关注 0票数 2

如何制作这个仪表板

从这些数据

代码语言:javascript
复制
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?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-23 14:20:49

您可以首先按时间和组列进行维度/分组,然后使用假组将一个组分成多个。

我没有访问您的数据的权限(在问问题时最好将数据粘贴为文本),所以我使用dc.js示例中的一个数据创建了一个示例。数据如下:

代码语言:javascript
复制
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放在第一位。这群人是正常的。

代码语言:javascript
复制
var runExptDim = cf.dimension(function(d) {
  return [d.Run, d.Expt];
});
var runExptGroup = runExptDim.group().reduceSum(function(d) {
  return d.Speed;
});

现在我们需要一个假组来用第二个密钥来分割原来的组。下面是一个函数,它允许我们为Expt的所有值构造假组

代码语言:javascript
复制
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()删除密钥的第二部分。

最后,它还必须对数据进行排序,因为多键往往会扰乱排序,因为数据被转换为字符串,以便在使用多键时进行排序。

抓取像这样的子组:

代码语言:javascript
复制
var splitGroup = split_group(runExptGroup);
var runGroup1 = splitGroup.subgroup(1),
  runGroup2 = splitGroup.subgroup(2),
  runGroup3 = splitGroup.subgroup(3);

因为我们有一个奇怪的维度,所以还不清楚应该在图表中指定什么维度。最简单的方法是在X轴上创建另一个维度:

代码语言:javascript
复制
var runDim = cf.dimension(function(d) {
  return d.Run;
});

然而,这将导致图表自身过滤。我以后可能会重新考虑我的答案,并纠正这一点。

图表初始化如下所示:

代码语言:javascript
复制
var line1 = dc.lineChart('#line1')
  .width(400).height(200)
  .dimension(runExptGroup)
  .group(runGroup1)
  .x(d3.scale.linear())
  .elasticX(true)
  .elasticY(true);

这并不包括您的样式需求,但您可以查看火花线例子获得一些提示。

这里有一个小提琴示例:https://jsfiddle.net/gordonwoodhull/og68rkqz/

希望这能有所帮助!

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

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

代码语言:javascript
复制
  function total_group(group) {
    return {
      value: () => d3.sum(group.all(), kv => kv.value)
    };
  }

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

奇怪的是,当使用groupAll时,它需要标识值访问器。把这一切结合在一起:

代码语言:javascript
复制
  var identity = x => x;
  
  var number1 = dc.numberDisplay('#num1')
    .valueAccessor(identity)
    .group(total_group(runGroup1));

你的小提琴叉:https://jsfiddle.net/gordonwoodhull/aj1m9ysg/1/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46757188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档