【问题标题】:D3.js stacked bar chart growing to negative directionD3.js 堆积条形图向负方向增长
【发布时间】:2017-09-20 20:15:23
【问题描述】:

我是 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 轴向下。

【问题讨论】:

  • 您的条形图从顶部开始增长,而您的数据从 0 开始并且您的轴位于顶部。你想从下向上(从 1200+ 开始)增加条形图还是改变整个方向并将 x 轴也放在底部?
  • 我想让 x 轴在底部,然后条形图一个接一个地向上增长,就像原始示例所示,但在垂直方向。
  • 好的,我在下面添加了答案。

标签: javascript d3.js stacked-chart stackedbarseries


【解决方案1】:

首先你必须改变你的 y-scale 的方向:

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

x 轴也必须进行转换,使其从“高度”开始。在 svg 中,顶部的高度 = 0,因此 svg 的底部等于“高度”:

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

【讨论】:

  • 是的!您的回答与我自己花了 4 个小时才弄清楚的变化完全相同……我希望我能早点看到这一点。谢谢,我想在阅读其他人的示例并尝试多种方法的四个小时中,我仍然学到了很多东西。
  • 干得好!我认为当您尝试提出一个好问题并与其他人讨论时,这是一种很好的学习方式。
【解决方案2】:

SVG 从左上角开始,因此指定的“高度”表示页面下方的高度,因此有些事情与您的预期相反。

首先从您的 y 比例开始:需要以相反的顺序 (height,0) 而不是 (0,height) 映射范围。

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 + ")");'

【讨论】:

  • 我根据您的建议进行了更改。 x 轴现在位于底部,y 轴现在位于 x 轴上方,这是一个很大的进步。但是,实际的刻度仍然是相反的顺序:1200 位于底部,0 位于顶部。
  • 只是做了一些更改,包括更改 'y' 和 'height' 的最终值。现在这完全符合我的要求。工作小提琴在这里:jsfiddle.net/maggiehu/e0r2pzc0/5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多