Javascript d3.js堆叠条形图-修改堆叠顺序逻辑

Javascript d3.js堆叠条形图-修改堆叠顺序逻辑,javascript,d3.js,Javascript,D3.js,我想创建一个堆叠条形图,其中矩形的顺序由数据值决定(即最大值到最小值、最高值到最短值、最富值到最穷值等)。据我所知,在叠加数据之后,初始顺序似乎得到了保留。这可以在我的代码片段中看到,硬编码数据让我们可以看到在d3.stack()前后发生了什么。请注意,第三个矩形fmc3从t1中的第三大变为t3中所有矩形中的最大,尽管其在堆栈中的位置保持不变: var-margins={top:100,bottom:300,left:100,right:100}; var高度=600; var宽度=900;

我想创建一个堆叠条形图,其中矩形的顺序由数据值决定(即最大值到最小值、最高值到最短值、最富值到最穷值等)。据我所知,在叠加数据之后,初始顺序似乎得到了保留。这可以在我的代码片段中看到,硬编码数据让我们可以看到在
d3.stack()前后发生了什么。请注意,第三个矩形
fmc3
t1
中的第三大变为
t3
中所有矩形中的最大,尽管其在堆栈中的位置保持不变:

var-margins={top:100,bottom:300,left:100,right:100};
var高度=600;
var宽度=900;
var totalWidth=宽度+边距。左+边距。右;
var totalHeight=高度+边距。顶部+边距。底部;
var svg=d3.select('body')
.append('svg')
.attr('width',totalWidth)
.attr(“高度”,总高度);
var graphGroup=svg.append('g')
.attr('transform','translate(“+margins.left+”,“+margins.top+”);
风险值数据=[
{句号:'t1',fmc1:2,fmc2:5,fmc3:6,fmc4:9,fmc5:10},
{句号:'t2',fmc1:3,fmc2:4,fmc3:9,fmc4:8,fmc5:11},
{句号:'t3',fmc1:3,fmc2:5,fmc3:15,fmc4:12,fmc5:10},
];
var groups=d3.map(数据,函数(d){return(d.period)}).keys();
var subgroups=Object.keys(数据[0]).slice(1);
var stackedData=d3.stack()
.密钥(子组)
(数据);
//控制台日志(stackedData);
var yScale=d3.scaleLinear()
.domain([0,80])
.范围([高度,0]);
var xScale=d3.scaleBand()
.domain(['t1','t2','t3'])
.范围([0,宽度])
.填充([5]);
var colorScale=d3.scaleOrdinal()
.域(子组)
“范围范围(”,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35.“b8cce4”、“#95b3d7”、“#4f81b9”、“#366092”、“#003366”]。反向();
graphGroup.append(“g”)
.全选(“g”)
.数据(stackedData)
.enter().append(“g”)
.attr(“fill”,函数(d){return colorScale(d.key);})
.selectAll(“rect”)
.data(函数(d){return d;})
.enter().append(“rect”)
.attr(“x”,函数(d){返回xScale(d.data.period);})
.attr(“y”,函数(d){return yScale(d[1]);})
.attr(“高度”,函数(d){返回yScale(d[0])-yScale(d[1]);})
.attr(“宽度”,xScale.bandwidth())

嗯,有一个用于指定顺序的内置功能,即。但是,它指定了计算整个序列的顺序,而不是堆栈中的每个值(我相信这是您想要的…在这种情况下,您必须创建自己的函数)

例如,使用
stack.order(d3.stackOrderDescending)

var页边距={
排名:0,
底部:0,
左:0,,
右:0
};
var高度=300;
var宽度=500;
var totalWidth=宽度+边距.left+边距.right;
var totalHeight=高度+页边距.top+页边距.bottom;
var svg=d3.select('body')
.append('svg')
.attr('width',totalWidth)
.attr(“高度”,总高度);
var graphGroup=svg.append('g')
.attr('transform','translate(“+margins.left+”,“+margins.top+”);
风险值数据=[{
句号:“t1”,
fmc1:2,
fmc2:5,
fmc3:6,
fmc4:9,
fmc5:10
},
{
句号:'t2',
fmc1:3,
fmc2:4,
fmc3:9,
fmc4:8,
fmc5:11
},
{
时段:“t3”,
fmc1:3,
fmc2:5,
fmc3:15,
fmc4:12,
fmc5:10
},
];
变量组=d3.map(数据,函数(d){
返回(d.period)
}).keys();
var subgroups=Object.keys(数据[0]).slice(1);
var stackedData=d3.stack()
.密钥(子组)
.订单(d3.stackOrderDescending)
(数据);
//控制台日志(stackedData);
var yScale=d3.scaleLinear()
.domain([0,60])
.范围([高度,0]);
var xScale=d3.scaleBand()
.domain(['t1','t2','t3'])
.范围([0,宽度])
.填充([5]);
var colorScale=d3.scaleOrdinal()
.域(子组)
“范围范围(”,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35.“b8cce4”、“#95b3d7”、“#4f81b9”、“#366092”、“#003366”]。反向();
graphGroup.append(“g”)
.全选(“g”)
.数据(stackedData)
.enter().append(“g”)
.attr(“填充”,功能(d){
返回色标(d键);
})
.selectAll(“rect”)
.数据(功能(d){
返回d;
})
.enter().append(“rect”)
.attr(“x”,函数(d){
返回xScale(d.data.period);
})
.attr(“y”,函数(d){
返回yScale(d[1]);
})
.attr(“高度”,功能(d){
返回yScale(d[0])-yScale(d[1]);
})
.attr(“宽度”,xScale.bandwidth())

这很有帮助,谢谢。这也证实了我的怀疑,即我们在值级别没有内置排序。如果我们需要的话,我可能还需要了解在这样一个定制函数的引擎盖下发生了什么。