D3.js堆积条形图向负方向发展

时间:2017-09-20 20:15:24

标签: javascript d3.js stacked-chart stackedbarseries

我是D3和javascripts的新手。我正在尝试构建一个动画垂直堆积条形图。我找到了一个水平堆积条形图的示例here。在调整之后,我得到了一个垂直堆积的条形图,然而,向下增长。这是my edited fiddle

更新:经过多次调整后,包括下面建议的调整,最终有效:final working upward growing stacked bar chart 我觉得我需要改变的地方应该在这个代码块中

rects = groups.selectAll('.stackedBar')
        .data(function(d,i) {console.log("data", d,i); return d; })
        .enter()
        .append('rect').attr('class','stackedBar')
        .attr('y', function(d) { return yScale(d.y0); })
        .attr('x', function(d, i) {return xScale(d.x); })
        .attr('height',0)
        .attr('width', xScale.rangeBand());

        console.log(document.querySelectorAll(".stacked"));
        var abc=document.querySelectorAll(".stackedBar");

     rects
        .transition()
        .delay(function(d,i,j){console.log("pre",j); return j*500;})
        .attr("y", function(d) { return yScale(d.y0); })
        .attr("height", function(d) { return yScale(d.y); } )
        .duration(1000);

但是我四处搜索并试图恢复yScale范围,即y的初始位置,但没有一个工作。我也注意到无论如何,我的yAxis总是低于我的X轴。

2 个答案:

答案 0 :(得分:1)

SVG从左上角开始,所以'身高'指定表示页面下方的高度,因此有些内容与您期望的相反。

首先从你的y尺度开始:范围需要以相反的顺序(高度,0)而不是(0,高度)进行映射。

yScale = d3.scale.linear().domain([0,yMax]).range([height,0]),1

同样,需要将x轴转换为从“高度”开始。

        svg.append('g')
        .attr('class', 'axis')
        .call(xAxis)
        .attr("transform", "translate(0," + height + ")");'

答案 1 :(得分:1)

首先,您必须更改y刻度的方向:

yScale = d3.scale.linear().domain([0,yMax]).range([height,0])

并且必须转换x轴,因此它从" height"开始。在svg中,top的高度= 0,所以svg的底部等于" height":

svg.append('g')
   .attr('class', 'axis')
   .call(xAxis)
   .attr("transform", "translate(0," + height + ")");

最后但同样重要的是,您必须更改堆积条形图的建筑方向,如:

rects
   .transition()
   .delay(function(d,i,j){console.log("pre",j); return j*500;})
   .attr("y", function(d) { return yScale(d.y + d.y0); })
   .attr("height", function (d) { return yScale(d.y0) - yScale(d.y + d.y0); } )
   .duration(1000);

以下是更新的fiddle