D3对数比例尺:底数无效果?

6

我感觉这可能只是我对对数刻度的工作原理误解,但我似乎无法让D3的对数刻度基数正常工作。

这个fiddle中,我尝试创建三个刻度尺,使用相同的base10刻度值,分别采用base10对数刻度、base4对数刻度和base2对数刻度。根据我对对数刻度的门外汉理解,base10对数刻度看起来正确——十的幂在轴上等距分布。但是,base4和base2刻度是相同的——在我看来,标签应该在这两个刻度上向右压缩。出了什么问题?

fiddle代码:

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个回答

5
基础(base())方法在我看来有点不准确。实际上,它是一个“显示基数”(displayBase)方法,仅更新刻度的位置和标签。
比例尺使用域(domain)和范围(range)设置来完成其工作。这是一种在许多不同比例尺中非常一致的方式,但对于对数,它有点不直观。
笨拙的方式:在您的情况下,修改域数组的上限值。例如,如果范围是[0, 1000],则对数以10为底的域应为[1, 3],以2为底的对数则为[0, 9.9658(近似值)]。通常情况下,顶部域值是顶部范围值的log(base-x)。如果底部范围值高于0,则也适用于底部范围值。
更简单的方法:将范围保留为[0,1]。然后您可以将域设置为[1, base]。比例尺会处理范围值之外的插值。

刚看到我在这里得到了一个答案。感谢您的回复!我们最终只使用了序数尺度,因为我们的间隔是明确定义的;这样控制正在发生的事情就容易得多了。不过下次尝试这种方法似乎也不错! - issa marie tseng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接