2012-05-20 92 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/