2012-05-20 42 views
2

我使用d3.js创建了一个类似于http://mbostock.github.com/d3/ex/stack.html的堆叠条形图,并带有一些额外的功能。我能够添加标签和网格,但我遇到了一些问题日志规模。我使用d3.js对数缩放堆积的条形图

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(“高度” ,函数(d){return y0(d) - y1(d);});

任何帮助将是伟大的。

+0

嗨,你有没有找到解决的办法? – Lloyd

回答

2

,我认为这将有助于为你一个基本的(非堆叠)条形图与对数刻度开始了 -

你想给你的等级表示法的名称,如:

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/