D3 Bar Chart Axis quirk

时间:2017-03-03 21:43:58

标签: javascript d3.js histogram axis

我有这段代码:https://plnkr.co/edit/t1GKaQOGnFxkTMK03Ynk

  var MIN = 60;
  var HR = MIN * 60;
  var tripDomain = [0, 15*MIN, 30*MIN, 45*MIN, 60*MIN, 90*MIN, Math.max(24*HR, d3.max(data))];

  var bins = d3.histogram()
    .thresholds(tripDomain)(data);

  var x = d3.scaleOrdinal()
    .domain(tripDomain)
    .range(tripDomain.map((_,i) => (i/(tripDomain.length-1))*width));

   // ...more code...

  chart.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x));

正确呈现直方图。唯一的问题是轴的第一个刻度是在彼此的顶部绘制0和61。它应该只有0 ...不确定61来自哪里(它是数据的第一个值),但我看不到它是如何在轴上结束的。

注意轴上的第一个值......你能否解释一下这个问题?

enter image description here

1 个答案:

答案 0 :(得分:2)

  

......不确定61来自哪里。

它来自比例域,当你追加矩形和文本时,你正在改变它!这是预期的行为,因为您使用了序数量表。

说明:

您的x比例域定义明确:

[0, 900, 1800, 2700, 3600, 5400, 1280703]

但是,在你的第一个bin中,你有这个(作为数组属性):

[x0: 61, x1: 900]

因此,每当您使用带有x比例的第一个bin的x0时,例如:

.attr("transform", function(d){
    return "translate(" + x(d.x0) + "," + y(d.length) + ")"; 
});

...您实际上在域中引入新值(有关详细说明,请参阅我的answer here),因为没有61在x比例域中。

顺便说一下,这个新值是在域的 end 引入的,尽管非常接近0,但61实际上是最后一个滴答。

解决方案:

声明unknown

var x = d3.scaleOrdinal()
    .unknown(0)

这是您更新的plunker:https://plnkr.co/edit/n1IoEkHcL0sGUraDVCfc?p=preview