这个问题可能对你有帮助:grouped category bar chart with different groups in d3?
但如果您只需要显示标签而不是按组显示颜色,那么您真正需要做的就是计算每个组中的值的数量:
// first, group the data
var groupedData = d3.nest()
.key(function(d) { return d.group; })
.rollup(function(v) { return v.length; })
.entries(data)
// then, get cumulative length of each group
var groupedData = groupedData.map((d, i) => {
const prev = nestedData[(i - 1)]
const cumsum = prev ? d.value + prev.cumsum : d.value
d.cumsum = cumsum
return d
})
这段代码将数据转换成这样的:
[
{
"key": 1,
"values": 2,
"cumsum": 2
},
{
"key": 2,
"values": 1,
"cumsum": 3
},
{
"key": 3,
"values": 3,
"cumsum": 6
}
]
现在您需要做的就是在图表标签下方添加组
const svg = //your svg selector here
const g = svg.append("g")
.attr("class", "group-labels")
.attr("x", 0)
.attr("y", height + 30) //adjust this so that the group labels are below your labels
g.selectAll(".group-label")
.data(groupedData)
.enter()
.append("text")
.attr("class", "group-label")
.attr("x", function(d, i) { return xScale.bandwidth() * d.cumsum - xScale.bandwidth() * d.value / 2 })
.attr("y", 0)
.attr("text-anchor", "middle")
.attr("dominant-baseline", "hanging")