этот код находится внутри фреймворка VUEJ.
Я работаю над созданием гистограммы с накоплением, но не смог использовать функцию стека D3.поэтому я попытался реализовать положение y и высоту прямоугольников другим способом.
Вот данные, которые у меня есть:
tasks: [
{
name:t1,
taskTotal:1000
taskStages: [
{
stageTotal: 200
},
{
stageTotal: 400
},{
stageTotal: 400
}
]
},
{
name:t2,
taskTotal:500
stages:[
{
stageTotal: 200
},
{
stageTotal: 300
}
],
}
]
Я пытался сделать шкалы, специфичные для каждой задачи, но безуспешно.
x pos каждого бара в порядке, моя проблемас y pos прямоугольника и высотой.
это код, который у меня сейчас есть:
getScaleForTask(task){
return d3.scaleLinear()
.range([0,this.svgHeight - 20])
.domain([0,task.taskTotal])
},
TaskCumulativeTotal(taskStages){
const arrOFCumulativeSums = [0]
taskStages.reduce((sumOfStages,currStage) => {
arrOFCumulativeSums.push(currStage.stageTotal + sumOfStages)
return currStage.stageTotal + sumOfStages;
},0);
return arrOFCumulativeSums
},
chartBuilder(){
let currCumulativeSum;
let yScaleForTask;
const taskG = svg
.selectAll('g')
.data(this.tasks)
.enter()
.append('g')
.attr(
'transform',
(d, i) => `translate(${cunmulativeGroupXPos[i]},0)`,
);
// from here i'm stuck
const stageG = taskG
.selectAll('g')
.data(d =>{
yScaleForTask = this.getScaleForTask(d);
currCumulativeSum = this.TaskCumulativeTotal(d.taskStages);
return d.taskStages;
})
.enter()
.append('g')
.attr('transform', d => xScale(d.taskName)); // this determins the x pos
stageG
.append('rect')
.attr('width', 30)
.attr('y', (d,i) => yScaleForTask(currCumulativeSum[i]))
.attr('height', d => yScaleForTask(d.stageTotal))
.attr('fill', (d, i) => (i % 2 === 0 ? '#66ccff' : '#99ff66'))
.attr('stroke', 'grey');
}
Вот как это выглядит в настоящее время
Я пытался заставить каждый этап задачи складываться на каждомдругой, я прочитал D3 Столбчатая диаграмма с разным уровнем стека
и https://bl.ocks.org/DimsumPanda/689368252f55179e12185e13c5ed1fee