【问题标题】:create multiple charts from data groups of the same column从同一列的数据组创建多个图表
【发布时间】:2017-10-15 16:16:44
【问题描述】:

如何制作这个仪表盘

从这个数据

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 crossfilter


    【解决方案1】:

    您可以通过首先按时间和组列进行维度/分组,然后使用假组将一个组拆分为多个来做到这一点。

    我无权访问您的数据(最好在提问时将您的数据粘贴为文本),因此我使用来自 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()方法被调用时,它会从原始组中拉取数据,使用key的第二部分过滤数据,并使用.map()删除key的第二部分。

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

    像这样抓取子组:

    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 以获得一些提示。

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

    希望这会有所帮助!

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

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

      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));
    

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

    【讨论】:

    • 感谢您的详细回复。我在小提琴中实现了您的建议:jsfiddle.net/gubzh/d24xh1wf/4 但它还没有工作。
    • 我忘了在上面包含我自己的小提琴链接,这是固定的。你的小提琴有两个问题。 (1) 在您的数据中 value 之后有一个空格,因此该字段被命名为 "value " 并且您得到了 NaN。 (2)你需要将你想要的标签的名称传递给subgroup(),所以.subgroup('group-1')等。你的小提琴叉:jsfiddle.net/gordonwoodhull/occjccj9/3
    • 感谢您的更正,迷你图可以正常工作。现在 numberDisplay 的问题,我需要总金额,但它显示最大值。我怎样才能解决这个问题?这是一个示例小提琴:jsfiddle.net/gubzh/d24xh1wf/7
    • 感谢您帮助戈登。最终版本在这里:jsfiddle.net/gubzh/d24xh1wf/26
    • 这真的很酷。当 SO 上的答案适合您时,请单击绿色复选标记接受答案。它给了我们两个代表点,并帮助后来的读者知道他们是否走在正确的轨道上。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多