0

我在 D3 中制作了一个条形图,该系列总共有 18 个条形图,我试图展示所有条形图如何聚集成低、中和高的范围(每个范围中有六个条形)。我希望这些集群中的每一个之间存在视觉差距(因此它们显然是不同的) - 问题是可以根据图表中未显示的其他数据来使用这些条形(考虑人口统计数据以查看条形以不同的方式聚集)。

这是现在的样子

这是我制作和排序条形的代码

        svg.selectAll("rect.bars")
            .data(dataset)
            .enter()
            .append("rect")
            .attr("class", "bars")
            .attr("x", 0 + padding)
            .attr("y", function(d, i){
                return yScale(i);
            })
            .attr("width", function(d) {
                return xScale(d.values[0]);
            })
            .attr("height", yScale.rangeBand())


        d3.select("#yield")
            .on("click", function(){
                svg.selectAll("rect.bars")
                    .sort(function(a, b){
                        return d3.ascending(a.values[0], b.values[0])
                    })
                    .transition()
                    .delay(function(d, i){
                        return i *50;
                    })
                    .duration(1000)
                    .attr("y", function(d, i) {
                        return yScale(i)
                    });
            });

        d3.select("#richPatch")
            .on("click", function(){
                svg.selectAll("rect.bars")
                    .sort(function(a, b){
                        return d3.ascending(a.values[1], b.values[1])
                    })
                    .transition()
                    .delay(function(d, i){
                        return i *50;
                    })
                    .duration(1000)
                    .attr("y", function(d, i) {
                        return yScale(i)
                    });

            });

        d3.select("#patchMoves")
            .on("click", function(){
                svg.selectAll("rect.bars")
                    .sort(function(a, b){
                        return d3.ascending(a.values[2], b.values[2])
                    })
                    .transition()
                    .delay(function(d, i){
                        return i *50;
                    })
                    .duration(1000)
                    .attr("y", function(d, i) {
                        return yScale(i)
                    });

            });

最终我试图让它看起来像这样(但水平布局)

在此处输入图像描述

4

1 回答 1

0

如果您d3.scale.ordinal使用ordinal.rangeBands创建一个刻度,您最终会得到一个刻度,该刻度根据您的域中值的数量(在您的情况下为 3)分解为离散带。缩放值将返回相关波段开始的位置。

Ordinal scales 配置rangeBands有一个很好的方便函数,称为ordinal.rangeBand,它将返回带的范围。因此,您可以首先将条形位置缩放到条带的开头,然后根据条带的范围以及条形的数量和每个条形的宽度进行一些数学运算,以简单地将条形均匀地分布在乐队。

于 2013-08-23T17:22:29.400 回答