【发布时间】:2018-09-18 16:00:06
【问题描述】:
此代码位于 VUEJ 框架内。
我正在创建堆叠条形图,但无法使用 D3 堆叠功能。 所以我尝试以不同的方式实现矩形的 y 位置和高度。
这是我拥有的数据:
tasks: [
{
name:t1,
taskTotal:1000
taskStages: [
{
stageTotal: 200
},
{
stageTotal: 400
},{
stageTotal: 400
}
]
},
{
name:t2,
taskTotal:500
stages:[
{
stageTotal: 200
},
{
stageTotal: 300
}
],
}
]
我尝试为每项任务制作特定的量表,但没有成功。
每个 Bar 的 x 位置很好,我的问题是矩形和高度的 y 位置。
这是我目前拥有的代码:
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 Stacked bar chart with different stack level
和 https://bl.ocks.org/DimsumPanda/689368252f55179e12185e13c5ed1fee
【问题讨论】:
-
你能把工作代码贴出来,方便帮助
标签: d3.js vue.js stacked-chart