2016-06-13 177 views
1

嗨,我是D3新手,我试图将普通条形图转换为堆积条形图。D3条形图堆积条形图

这是我的代码

var data = [4, 8, 15, 16, 23, 42, 200]; 

var height = 200; 
var width = 200; 
var barWidth = 35; 
var barOffset = 5; 

var myChart = d3.select(".chart").append('svg') 
.attr('width', width) 
.attr('height', height) 
.style("background", "grey") 
.selectAll('rect') 
.data(data) 
.enter().append('rect'). 
style("fill", "blue") 
.attr("width", barWidth) 
.attr("height", function(d){ return d;}) 
.attr('x', function(d, i) 
     { return i *(barWidth + barOffset);}) 
.attr('y', function(d){ 
    return height - d; 
}); 

任何帮助或提示在正确的方向,将不胜感激。

+2

这不是一个简单的事。你必须计算你堆积的矩形的相对位置。查找堆积条形图(或教程)的示例并从此开始。 – user3791775

回答

4

只是为了评论以上答案。

这里是代码 -

var data = [ 
 
\t [4, 8, 15, 16, 23, 42, 200], 
 
\t [50, 60, 20, 100, 30, 50, 40] 
 
\t ]; 
 
//console.log(data) 
 

 
//console.log("REMAP---------------------------"); 
 
var remapped =data[0].map(function(dat,i){ 
 
    return data.map(function(d,ii){ 
 
     return {x: ii, y: d[i] }; 
 
    }) 
 
}); 
 

 

 
var w = 200, 
 
h = 200 
 

 
// create canvas 
 
var svg = d3.select(".chart").append("svg:svg") 
 
.attr("width", w) 
 
.attr("height", h) 
 
.append("svg:g") 
 
.attr("transform", "translate(0,"+h+")"); 
 

 
var x = d3.scale.ordinal().rangeRoundBands([0, w], 0.5) 
 
var y = d3.scale.linear().range([0, h]) 
 
var color = d3.scale.ordinal() 
 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]).domain(data[0].map(function(d,i){return i;})); 
 

 

 

 
//console.log("LAYOUT---------------------------"); 
 
var stacked = d3.layout.stack()(remapped) 
 
//console.log(stacked) 
 

 
x.domain(stacked[0].map(function(d) { return d.x; })); 
 
y.domain([0, d3.max(stacked[stacked.length - 1], function(d) { return d.y0 + d.y; })]); 
 

 
// show the domains of the scales    
 
console.log("x.domain(): " + x.domain()) 
 
console.log("y.domain(): " + y.domain()) 
 

 

 
// Add a group for each column. 
 
var valgroup = svg.selectAll("g.valgroup") 
 
.data(stacked) 
 
.enter().append("svg:g") 
 
.attr("class", "valgroup") 
 
.style("fill", function(d, i) { return color(i); }) 
 
.style("stroke", function(d, i) { return d3.rgb(color(i)).darker(); }); 
 

 
// Add a rect for each date. 
 
var rect = valgroup.selectAll("rect") 
 
.data(function(d){return d;}) 
 
.enter().append("svg:rect") 
 
.attr("x", function(d) { return x(d.x); }) 
 
.attr("y", function(d) { return -y(d.y0) - y(d.y); }) 
 
.attr("height", function(d) { return y(d.y); }) 
 
.attr("width", x.rangeBand());
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 

 
<div class="chart"></div> 
 
\t \t

2

这里的数据起着重要的作用。 您需要修改与图表类型兼容的数据。

这是您的问题的解决方案。

希望,这一定会帮助你。谢谢:)

var data = [4, 8, 15, 16, 23, 42, 200]; 
 

 
data = data.map(function(d) { return [{x: 0, y: d}] }); 
 

 
var stack = d3.layout.stack(); 
 
var stackData = stack(data); 
 
var color = d3.scale.ordinal() 
 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]).domain(data.map(function(d,i){return i;})); 
 

 
var height = 200; 
 
var width = 200; 
 
var barWidth = 35; 
 
var barOffset = 5; 
 

 
var lastData = stackData[stackData.length-1][0]; //to get the max value 
 
var y = d3.scale.linear() 
 
    .rangeRound([height, 0]).domain([0, lastData.y+lastData.y0]); 
 

 
var myChart = d3.select(".chart").append('svg') 
 
.attr('width', width) 
 
.attr('height', height) 
 
.style("fill", "grey") 
 
.selectAll('rect') 
 
.data(stack(data)) 
 
.enter().append('rect'). 
 
style("fill", function(d,i) { 
 
\t return color(i); 
 
}) 
 
.attr("width", barWidth) 
 
.attr('x', 0) 
 
.attr("y", function(d) { 
 
\t return y(d[0].y0+d[0].y); 
 
}) 
 
.attr("height", function(d) { 
 
\t return height - y(d[0].y); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<div class="chart"></div>

是!理想的叠置条形图必须要求2D阵列

以下是几个方案是将让你了解清楚

场景1 -

我们需要可视化销售MAC(只有一个产品) 5年

那么数据将是:销售:[$ 2000 $ 5555,$ 20177,$ 9999 $ 80805]

所以在这里我们需要简单的柱状图,其中每个栏将显示在相应的年度销售

塞纳里奥2 -

我们需要可视化销售的3个款产品(MAC,的iPad,iPhone)5年 则数据将是:

销售MAC的:[$ 2000 $ 5555,$ 20177,$ 9999 $ 80805]

销售的iPad:[$ 2000 $ 5555,$ 20177,$ 9999 $ 80805]

销售iPhone的:[$ 2000 $ 5555,$ 20177,$ 9999 $ 80805]

这里我们需要堆叠酒吧聊天,其中每个堆栈将显示3种产品的销售在各年

如果我们有多个阵列的话..除了上面的代码中,我们所需要的,X比例

你可以按照exapmle

希望这将帮助:)谢谢:)

+0

谢谢您的评论。我有一个问题,如果你能这么好好回答。我看到你正在使用数组创建一个栏。你将如何创建多个酒吧?你需要多个数组吗?对不起,如果这是一个愚蠢的问题。 – user3837019

+0

嘿!为你的问题添加了澄清的答案..只是检查.. –

+0

啊,谢谢你。对不起最后一个问题,你会如何添加另一个堆叠的酒吧目前你有1个酒吧,你会如何添加另一个1?所以再次抱歉提问。我很欣赏你帮助我的时间和效果。 – user3837019