当前位置: 代码迷 >> JavaScript >> 使用Dimple.js汇总分类变量
  详细解决方案

使用Dimple.js汇总分类变量

热度:55   发布时间:2023-06-05 11:47:14.0

我正在尝试使用Dimple.js和D3基于两个非数字变量创建一个堆积的条形图。 数据集包含大约50,000个点,每个点以两种方式(部门和渠道)分类。 理想情况下,x轴是一系列类别(通道),而y轴表示这些相同类别的计数。 我希望基于第二系列类别(部门)来堆叠条形图。

下面的代码完成了堆栈工作,但是如图所示,它没有显示所有通道的总数,而只是指示了特定扇区中通道的存在。

var myChart = new dimple.chart(svg, data);
      var x = myChart.addCategoryAxis("x", "channel"); 
      myChart.addMeasureAxis("y","channel");
      myChart.addSeries("channel", dimple.plot.bar);
      myChart.draw();

图片: :

有没有一种方法可以使用Dimple进行聚合? 似乎无法在文档中找到它。 任何人愿意帮助/有经验的人吗?

非常感谢!

您的代码示例中有一个错字,这不是这里的问题。 为了让以后阅读此答案的任何人都清楚,应该阅读(否则我的答案没有任何意义!):

myChart.addSeries("segment", dimple.plot.bar);

当您在类别上创建度量轴时,它会计算该类别的不同值,在您的情况下,每个通道/段当然都将具有单个不同的通道,这意味着它的值为1。

您在此处面临的问题是,Dimple在执行其他任何操作之前,会将数据聚合到代码(在本例中为通道/段)中定义的最低粒度级别。 这意味着像这样的数据集:

channel      segment    brand      sales
----------------------------------------
Ecommerce    Sports     Nike        2000
Ecommerce    Sports     Reebok      3000
Ecommerce    Sports     Adidas      4000
Retail       Sports     Nike        5000
Retail       Sports     Reebok      6000
Retail       Sports     Adidas      7000
Retail       Sports     Puma        8000

会成为:

channel      segment
--------------------
E-commerce   Sports
Retail       Sports

因此计数的任何细节都将丢失。

因此,您有2个选择,这两个选择都要求您对数据进行某种处理,除非您已经可以使用它们。 第一个假设在您的示例中,您有一个唯一的列(或每个通道/细分组合至少是唯一的),即品牌。 这意味着您可以将代码更改为:

var myChart = new dimple.chart(svg, data);
var x = myChart.addCategoryAxis("x", "channel"); 
myChart.addMeasureAxis("y","brand");
myChart.addSeries("segment", dimple.plot.bar);
myChart.draw();

现在,您的数据将被分组为:

channel      segment      dist brands
-------------------------------------
Ecommerce    Sports                 3
Retail       Sports                 4

替代方法是在数据中添加一列1:

channel      segment    brand      sales     count
--------------------------------------------------
Ecommerce    Sports     Nike        2000         1
Ecommerce    Sports     Reebok      3000         1
Ecommerce    Sports     Adidas      4000         1
Retail       Sports     Nike        5000         1
Retail       Sports     Reebok      6000         1
Retail       Sports     Adidas      7000         1
Retail       Sports     Puma        8000         1

与其他任何数字列的总和:

var myChart = new dimple.chart(svg, data);
var x = myChart.addCategoryAxis("x", "channel"); 
myChart.addMeasureAxis("y","count");
myChart.addSeries("segment", dimple.plot.bar);
myChart.draw();

给出相同的结果

channel      segment      sum of count
--------------------------------------
Ecommerce    Sports                  3
Retail       Sports                  4
  相关解决方案