首先,我们要知道这个d3.scaleBand()是将散点分布来进行比例尺的放缩,.domain()
中是一个数组,而不是一个范围,但是.range()
中的是一个范围,一个区域。
而对我来说这个d3.scaleBand()中最重要的,就是这个bandwidth
问题,因为我需要用这个来画一些能动态导入数据的图,而且需要在两个柱子之间插入连线,因此需要非常准确的计算这个bandwidth的数值。
具体可以参考https://github.com/d3/d3-scale/blob/v3.2.2/README.md#scaleBand 和 https://observablehq.com/@d3/d3-scaleband这两个网址,可以查看其他参数的用法。
第二个页面中也有关于这个bandwidth的介绍,但是讲的有点笼统,具体一点的算法如下:
如上图所示,我们可以对这些高度进行定义,为了解释清楚,特意将paddingOuter设置为0:
h = 我们的整个用来画这个柱状图的高度
bandwidth = 一个柱子的高度
step = 将柱子高度和空出来的加起来
step × paddingInner = 柱子中间空出来的高度
n = 柱子数量
由图可以很明显的看出来,我们可以有
h = step × (n - paddingInner)
step = h / (n - paddingInner)
bandwidth = h / (n - paddingInner) × (1 - paddingInner)
由此我们可以计算出我们每一个柱子所在的高度(y值大小)及其边缘所在位置的高度(y值大小)
对于其他的比如paddingOuter和align可以参考上面的第二个网址进行学习。
网友评论