我正在尝试在D3js中构建一个堆积条形图 . 我有问题设置正确的 y
和 y0
属性并在正确的位置绘制条形图 . 可能我有一个计算错误,但我找不到它 . 这是示例代码的链接FIDDLE场景是:
-
我首先按"period"对数据进行分组,并在xAxis上显示句点
-
然后我按"type"分组 - MONTH和ENTRY应该是不同颜色的堆叠条 .
-
每个周期的每种类型的总和"amount"显示在yAxis上 .
我使用带有2个键的嵌套函数来构造数据 . 当我在实际堆叠条形图中绘制条形时,会出现问题 . 我不确定问题是在我访问数据(键和值)的方式,还是我设置属性“y”和“height”的方式 .
selection.selectAll("rect")
.data(function (d) { return d.values; })
.enter().append("rect")
.attr("width", x.rangeBand())
.attr("y", function (d) { return y(d.values); })
.attr("height", function (d) { return y(d.y0) + y(d.values); })
//.attr("height", function (d) { return y(d.y0) - y(d.values); })
.style("fill", function (d) { return color(d.key); })
明显的错误是其中一个酒吧隐藏在另一个酒吧后面 . 第二个栏位于xAxis下 .
我是d3js的初学者,我找不到解决方案 . 有人能帮助我吗?
1 回答
我可以看到一些东西:
看起来你的
nest
过于复杂 . 您应该只需要嵌套一个级别 .当您确实希望最大值为堆栈总数时,您计算的最大值将只是堆栈中单个元素的最大值 .
您正在创建的组元素(
g
)似乎按"wrong"方式分组 . 您通常希望将每个堆栈的"bit"分组 . 也就是说,您希望每个堆栈的第一个rect
与其他第一个rect
在同一组中 . 然后每个堆栈中的第二个将与另一个第二个rect
分组,依此类推 . 这可能是由于第一点的嵌套错误 .你实际上需要计算
valueOffset
,这是你在小提琴中得到的,但是被注释掉了 . 该值用于设置构造堆栈时的相对位置 .为了帮助,我根据你所写的内容整理了正确的内容 . 看看下面的代码片段 .
关于上述代码段的一些注释(符合我的评论):
这比前一个简单得多,并且不需要执行汇总功能 . 当您想要汇总数据时通常需要汇总,在这种情况下您不需要汇总,这应该是您的嵌套过于复杂的赠品 .
这将计算您的轴需要采取的最大值,使一切都很合适 .
如果查看生成的SVG,您将看到我对每个堆栈中
rect
的分组的含义 . 我通常发现它没有"right"方式,但这通常对我来说最好 .stack
中valueOffset
的计算:计算出的
valueOffset
用于堆栈中的每个rect
相对于其他rect
的位置 . 您将看到它使用了几次,计算最大y
值,每个rect
的y
attr,以及每个rect
的height
.我没有解释我所做的每一项更改,但希望通过上述内容和代码片段,您将能够解决这些差异并将其应用于您的确切用例 .