d3 log scale:基础没有效果?
d3 log scale: base not making an effect?
我觉得这可能只是我误解了对数刻度的工作原理,但我似乎无法让 D3 对数刻度底工作。
在 this fiddle 中,我尝试使用同一组 base10 刻度创建三个比例尺,一个 base10 对数比例尺,一个 base4 对数比例尺,一个 base2 对数比例尺。根据我对对数刻度的外行理解,以 10 为底的对数刻度看起来是正确的——10 的幂在轴上等距分布。但是,base4 和 base2 尺度是相同的——在我看来,标签应该在这两个尺度上压缩到右边。怎么回事?
繁琐的代码:
ticks = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
elems = { ten: 10, four: 4, two: 2 }
for selector, base of elems
dom = d3.select('.scale.' + selector)
scale = (new d3.scale.log()).base(base).domain([ 0.5, 10000000 ]).range([ 0, 500 ])
dom.selectAll('div')
.data(ticks)
.enter().append('div')
.text((x) -> x)
.style('left', (x) -> scale(x) + 'px')
base() 方法有点用词不当,IMO。它实际上是一个 displayBase 方法,因为它只更新刻度的定位和标签。
天平使用 domain 和 range 设置来发挥它们的魔力。这是在许多不同规模上做事的一种非常一致的方式,但对于日志来说,它有点不直观。
笨办法:你的情况,修改域数组的上限值。例如,如果范围是 [0, 1000],那么 log-base10 的域应该是 [1, 3],log-base2 的域应该是 [0, 9.9658 (approx)]。一般来说,top domain value 是 top range value 的 log(base-x)。如果它高于 0,则与底部范围值同上。
更简单的方法:将范围保留为[0,1]。然后你可以将域设置为[1,base]。比例尺负责范围值之外的插值。
我觉得这可能只是我误解了对数刻度的工作原理,但我似乎无法让 D3 对数刻度底工作。
在 this fiddle 中,我尝试使用同一组 base10 刻度创建三个比例尺,一个 base10 对数比例尺,一个 base4 对数比例尺,一个 base2 对数比例尺。根据我对对数刻度的外行理解,以 10 为底的对数刻度看起来是正确的——10 的幂在轴上等距分布。但是,base4 和 base2 尺度是相同的——在我看来,标签应该在这两个尺度上压缩到右边。怎么回事?
繁琐的代码:
ticks = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
elems = { ten: 10, four: 4, two: 2 }
for selector, base of elems
dom = d3.select('.scale.' + selector)
scale = (new d3.scale.log()).base(base).domain([ 0.5, 10000000 ]).range([ 0, 500 ])
dom.selectAll('div')
.data(ticks)
.enter().append('div')
.text((x) -> x)
.style('left', (x) -> scale(x) + 'px')
base() 方法有点用词不当,IMO。它实际上是一个 displayBase 方法,因为它只更新刻度的定位和标签。
天平使用 domain 和 range 设置来发挥它们的魔力。这是在许多不同规模上做事的一种非常一致的方式,但对于日志来说,它有点不直观。
笨办法:你的情况,修改域数组的上限值。例如,如果范围是 [0, 1000],那么 log-base10 的域应该是 [1, 3],log-base2 的域应该是 [0, 9.9658 (approx)]。一般来说,top domain value 是 top range value 的 log(base-x)。如果它高于 0,则与底部范围值同上。
更简单的方法:将范围保留为[0,1]。然后你可以将域设置为[1,base]。比例尺负责范围值之外的插值。