0👍
✅
Found a way to make it work: posting the code for future reference.
they way I solved this was to iterate over the tasks and for each task add a group and inside each group add the bars.
this way i didn’t lose the cumulative sums which i needed for the y position.
chartBuilder() {
const longestTask = this.getLongestTask();
const taskNames = this.tasks.map(t => t.taskName);
const xScale = d3.scaleBand()
.domain(taskNames)
.rangeRound([0, this.svgWidth]);
const svg = d3.select('#stacked-svg-tasks');
const yScaleForTask = this.getScaleForTask(this.svgHeight - 20, longestTask);
const barWidthScale = Math.round(this.svgWidth / this.tasks.length) - this.GbGS;
// adding data to show as bar chart
this.tasks.forEach((task, taskIndex) => {
const currCumulativeSum = this.CumulativeTimeOfStages(task.taskStages);
const data = [task];
const currTask = svg
.selectAll(`bar${taskIndex}`)
.data(data)
.enter()
.append('g')
.attr('class', `bar${taskIndex}`)
.attr(
'transform',
`translate(${xScale(task.taskName)},0)`,
)
.selectAll('rect')
.data(d => d.taskStages)
.enter()
.append('rect')
.attr('y', (d, i) => this.svgHeight - yScaleForTask(currCumulativeSum[i]))
.attr('width', barWidthScale)
.attr('height', d => yScaleForTask(d.totalTime))
.attr('fill', (d, i) => (i % 2 === 0 ? '#66ccff' : '#99ff66'));
});
Source:stackexchange.com