【问题标题】:D3 Stacked Bar chart : issue calculating and displaying sum/total of each barD3堆积条形图:计算和显示每个条形图的总和/总计
【发布时间】:2020-07-04 18:08:52
【问题描述】:

我正在尝试计算图表中每个堆积条形的总和/总值并将其显示在每个条形上方

https://jsfiddle.net/n0zjpyow/1/

期望的输出:

(注意:图片中的总数不准确)

我正在使用嵌套和汇总函数,但结果是每个系列的总数,而不是每个堆叠条的总数。

var keys = d3.nest()
.key(function(d) { return (d.key) })
.rollup(function (v) {
  return d3.keys(v[0]).filter(function(p, i){return i}) //filter out the heading
    .reduce(function(s, p){   //sum each of the other members
      //p is the category being summed
      return (s[p] = d3.sum(d3.values(v[0][p][0])), s);
    }, {});
})
.map(data);

输出

{1: {values: 190000000}
 2A: {values: 152000000}
 2B: {values: 190000000}
 Non: {values: 128000000}}

我对如何将其应用于图表的数据结构(无法修改)感到困惑

如何计算每个条中的值的总和?感谢您的帮助。

【问题讨论】:

  • 数据数组中的所有值是否总是具有相同的键?即data[1].values 的日期是否可能比data[0].values 多?

标签: javascript d3.js svg nvd3.js


【解决方案1】:

根据您的数据,计算每个柱的总值的简单方法如下:

var total = [0, 0, 0, 0, 0, 0];
data.forEach(e => {
  e.values.forEach( (f, i) => {
    total[i] = total[i] + f[1];
  });
});

每个对象的位置(12A2BNon),然后是每个日期(Jan '19 SJan '19 U、...、Mar '19 U )。结果累加到数组total

[ 660000000, 1015000000, 598000000, 484000000, 528000000, 396000000 ]

关于显示每个条的总数,你可以在这个sn-p中找到一个潜在的解决方案:

https://jsfiddle.net/s5npfdo0/

输出如下:

需要考虑的几点:

  • AFAIK,NVD3 不允许在多条图中显示每个条的总值(例如,请参阅 this issue)。解决方案是自己实现该部分。在我的 sn-p 中,实现非常简单,但它缺少一些功能,例如,如果您调整窗口大小,则不会重新计算总值位置。如果这对您的用例来说是个问题,我可以尝试解决它。​​

  • 函数addTotalValue()需要在图形完全绘制后调用,因为它是用setTimeout(addTotalValue, 500);调用的

  • NVD3 根据数据自动计算的 yDomain 没有为总值标签留出空间,因此 yDomain 应强制为另一个值:.yDomain([0, 1100e6])。这里是手动计算的 1100e6,只适合这个数据,但是从数据中自动计算应该不难。

【讨论】:

  • 非常感谢您抽出宝贵的时间写出如此详细而有帮助的答案,您让我度过了我的星期五!它对我来说非常有效。
  • 很高兴能帮上忙! :)
  • 如果可以的话,还有一个快速的问题。最大值的总数未显示,我想问题出在 yDomain 值上。在您的小提琴中,我看到您指定了一个值,但是如果总数是动态的,我应该在此处输入什么?
  • 大概,最大值加10%就够了。即,yDomain=largest_value*1.1。如果您需要更多空间,请尝试使用 1.2 或 1.3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2019-06-07
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多