D3 堆叠条形图:计算和显示每个条形图 sum/total 的问题
D3 Stacked Bar chart : issue calculating and displaying sum/total of each bar
我正在尝试计算图表中每个堆叠条形图的 sum/total 值并将其显示在每个条形图上方
https://jsfiddle.net/n0zjpyow/1/
期望的输出:
(注意:图片中的总数不准确)
我正在使用 nest 和 rollup 函数,但结果是每个系列的总和,而不是每个堆叠条。
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}}
我对如何将其应用到图表的数据结构(无法修改)感到困惑
我如何计算每个条中的总值?感谢您的帮助。
根据您的数据,计算每个柱的总值 的简单方法如下:
var total = [0, 0, 0, 0, 0, 0];
data.forEach(e => {
e.values.forEach( (f, i) => {
total[i] = total[i] + f[1];
});
});
您要遍历每个对象的位置(1
、2A
、2B
、Non
),然后遍历每个日期(Jan '19 S
, Jan '19 U
, ..., Mar '19 U
)。结果累加到数组total
:
[ 660000000, 1015000000, 598000000, 484000000, 528000000, 396000000 ]
关于显示每个柱的总数,您可以在这个片段中找到一个潜在的解决方案:
https://jsfiddle.net/s5npfdo0/
具有以下输出:
需要考虑的几点:
AFAIK,NVD3 不允许在多条形图中显示每个条形的总值(例如,参见 this issue)。解决方案是自己实施该部分。在我的代码片段中,实现非常简单,但缺少一些功能,例如,如果您调整 window 的大小,则不会重新计算总值位置。如果这对您的用例来说是个问题,我可以尝试解决它。
函数addTotalValue()
需要在图形完全绘制后调用,因为它是用setTimeout(addTotalValue, 500);
[调用的=26=]
NVD3 根据数据自动计算的 yDomain 没有给出总值标签 space,因此 yDomain 应该强制为另一个值:.yDomain([0, 1100e6])
。这里是手动计算的1100e6,只适合这个数据,但是从数据自动计算应该不难。
我正在尝试计算图表中每个堆叠条形图的 sum/total 值并将其显示在每个条形图上方
https://jsfiddle.net/n0zjpyow/1/
期望的输出:
(注意:图片中的总数不准确)
我正在使用 nest 和 rollup 函数,但结果是每个系列的总和,而不是每个堆叠条。
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}}
我对如何将其应用到图表的数据结构(无法修改)感到困惑
我如何计算每个条中的总值?感谢您的帮助。
根据您的数据,计算每个柱的总值 的简单方法如下:
var total = [0, 0, 0, 0, 0, 0];
data.forEach(e => {
e.values.forEach( (f, i) => {
total[i] = total[i] + f[1];
});
});
您要遍历每个对象的位置(1
、2A
、2B
、Non
),然后遍历每个日期(Jan '19 S
, Jan '19 U
, ..., Mar '19 U
)。结果累加到数组total
:
[ 660000000, 1015000000, 598000000, 484000000, 528000000, 396000000 ]
关于显示每个柱的总数,您可以在这个片段中找到一个潜在的解决方案:
https://jsfiddle.net/s5npfdo0/
具有以下输出:
需要考虑的几点:
AFAIK,NVD3 不允许在多条形图中显示每个条形的总值(例如,参见 this issue)。解决方案是自己实施该部分。在我的代码片段中,实现非常简单,但缺少一些功能,例如,如果您调整 window 的大小,则不会重新计算总值位置。如果这对您的用例来说是个问题,我可以尝试解决它。
函数
addTotalValue()
需要在图形完全绘制后调用,因为它是用setTimeout(addTotalValue, 500);
[调用的=26=]NVD3 根据数据自动计算的 yDomain 没有给出总值标签 space,因此 yDomain 应该强制为另一个值:
.yDomain([0, 1100e6])
。这里是手动计算的1100e6,只适合这个数据,但是从数据自动计算应该不难。