使用对数比例尺的d3.js堆积条形图

3

我正在使用d3.js创建一个堆积条形图,类似于http://mbostock.github.com/d3/ex/stack.html,并添加了一些附加功能,如标签和网格。但是我在实现对数比例尺时遇到了一些问题。我正在使用

d3.scale.log().domain([minNum,maxNum]).range([height,0]) 

但是我不知道如何在堆叠图中实现它,以下是代码:

var vis = d3.select("#chart")
.append("svg")
.attr("width", width)
.attr("height", height + margin);

var layers = vis.selectAll("g.layer")
.data(data)
 .enter().append("g")
.style("fill", function(d, i) { return color(i / (n - 1)); })
.attr("class", "layer");

var bars = layers.selectAll("g.bar")
.data(function(d) { return d; })
.enter().append("g")
.attr("class", "bar")
.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; });

bars.append("rect")
.attr("width", x({x: .9}))
.attr("x", 0)
.attr("y", y1)
.attr("height", function(d) { return y0(d) - y1(d); });

我知道它涉及以下内容: .attr("height", function(d) { return y0(d) - y1(d); }); 任何帮助都将不胜感激。
3个回答

3
我遇到了这个非常古老的帖子,这里有信息说明为什么对于堆积条形图来说几乎从不使用对数刻度,而对于普通的条形图或面积图(即具有基础形状的图表)也很少使用。

enter image description here


1

我认为对你有帮助的是从一个基本(非堆叠)柱状图开始,使用对数刻度--

你需要给你的刻度表示命名,例如:

var myscale = d3.scale.log().domain([minNum,maxNum]).range([height,0]);

然后稍后使用此比例尺转换为屏幕空间,例如:

.attr("height", function(d) {return myscale(d);})

这里有一个基本的例子供您查看: http://jsfiddle.net/jsl6906/qAHC2/10/


0

简短指南。

  1. 使用 stack 来处理原始数据集。
  2. 使用 D3 的特殊设置 scale 来创建一个具有对数值的第二个数据集。
  3. 再次使用 stack 来处理结果集。
// Original linear data
var linData = [
    [
        { x: 0, y:     0.1 },
        { x: 1, y:     1.0 },
        { x: 2, y:   100.0 },
        { x: 3, y: 10000.0 }
    ],
    [
        { x: 0, y:     0.2 },
        { x: 1, y:     2.0 },
        { x: 2, y:   200.0 },
        { x: 3, y: 20000.0 }
    ],
    [
        { x: 0, y:     0.3 },
        { x: 1, y:     3.0 },
        { x: 2, y:   300.0 },
        { x: 3, y: 30000.0 }
    ]
];


// Calculating y0 for linear data
var stack = d3.layout.stack();
stack(linData);

// Setting conversion values from linear to logarithmic without scaling
var yScaleLog = d3.scale.log()
        .domain([0.01,
            d3.max(linData, function(d) {
                return d3.max(d, function(d) {
                    return d.y0 + d.y;
                });
            })
        ])
        .range([0,
            d3.max(linData, function(d) {
                return d3.max(d, function(d) {
                    return d.y0 + d.y;
                });
            })
        ]);

// Creating new set of data with logarithmized values
var logData = [];
for (var i = 0; i < linData.length; i++) {
    logData[i] = [];
    for (var j = 0; j < linData[i].length; j++) {
        logData[i][j] = {
            x: linData[i][j].x,
            y: yScaleLog(linData[i][j].y)
        };
    }
}

// Calculating y0 for logarithmic data
stack(logData);

完整代码:http://jsfiddle.net/romanshamin/5vF6a/2/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接