【问题标题】:D3 bar chart to stacked bar chartD3条形图到堆积条形图
【发布时间】:2016-10-13 08:07:45
【问题描述】:

您好,我是 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;
});

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

【问题讨论】:

  • 这不是一件简单的事情。您必须计算堆叠矩形的相对位置。查找堆叠条形图(或教程)的示例并从那里开始。

标签: javascript d3.js charts bar-chart stacked-chart


【解决方案1】:

仅用于对上述答案的评论..

这里是代码 -

var data = [
	[4, 8, 15, 16, 23, 42, 200],
	[50, 60, 20, 100, 30, 50, 40]
	];
//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>
		

【讨论】:

    【解决方案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) { 
    	return color(i); 
    })
    .attr("width", barWidth)
    .attr('x', 0)
    .attr("y", function(d) { 
    	return y(d[0].y0+d[0].y); 
    })
    .attr("height", function(d) { 
    	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 -

    我们需要可视化 5 年的 3 种产品(MAC、iPad、iPhone)的销售额 那么数据将是:

    MAC 的销售额:[2000 美元、5555 美元、20177 美元、9999 美元、80805 美元]

    iPad 销售额:[2000 美元、5555 美元、20177 美元、9999 美元、80805 美元]

    iPhone 销售额:[2000 美元、5555 美元、20177 美元、9999 美元、80805 美元]

    这里我们需要堆叠条形聊天,每个堆叠会显示相应年份的 3 种产品的销售额

    如果我们有多个数组,那么.. 除了上面的代码,我们还需要 x 缩放

    您可以关注exapmle

    希望这会有所帮助 :) 谢谢 :)

    【讨论】:

    • 感谢您的评论。我有一个问题,如果你能这么好心地回答。我看到您正在使用数组创建一个条形图。您将如何创建多条?你需要多个数组吗?如果这是一个愚蠢的问题,请提前道歉。
    • 啊,谢谢你。抱歉最后一个问题,您将如何添加另一个堆叠条。目前您有 1 个酒吧,您将如何添加另一个 1?很抱歉再次提出问题。我非常感谢您为帮助我所付出的时间和精力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2019-06-19
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多