d3对数比例:基数没有效果?

时间:2015-02-03 01:10:15

标签: d3.js

我觉得这可能只是我误解了对数标度是如何工作的,但我似乎无法让D3对数标度基础起作用。

this fiddle中,我尝试使用相同的base10标记集创建三个标度,具有base10对数标度,base4对数标度和base2对数标度。根据我对外行对数尺度的理解,base10对数刻度看起来是正确的 - 十个幂在轴上等距离间隔。但是,base4和base2的尺度是相同的 - 在我看来,标签应该在这两个尺度上向右压缩。发生了什么事?

Fiddly code:

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')

1 个答案:

答案 0 :(得分:3)

base()方法有点用词不当,IMO。它实际上是一个 displayBase 方法,因为它只更新刻度的定位和标签。

Scales使用范围设置来实现他们的魔力。这是一种很好的一致的方式,可以跨越许多不同的规模,但对于日志,它有点不直观。

尴尬的方式:在您的情况下,修改域数组的上限值。例如,如果范围是[0,1000],那么对于log-base10,域应为[1,3],对于log-base2,域应为[0,9.9658(约)]。通常,顶级域值是顶级值的log(base-x)。如果它高于0,则同样使用底部范围值。

更简单的方法:将范围保留为[0,1]。然后,您可以将域设置为[1,base]。比例负责范围值之外的插值。