D3 条形图轴怪癖

阿德里安

我有这个代码: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 来自哪里(它是数据的第一个值),但我不知道它是如何在轴上结束的。

请注意轴上的第一个值...您能解释一下这个问题吗?

在此处输入图片说明

杰拉尔多·费塔朵

...不确定 61 是从哪里来的。

它来自比例域,当您附加矩形和文本时,您正在更改该域!这就是预期的行为,因为您使用的是有序量表。

解释:

您的x标度域定义明确:

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

但是,在第一个容器中,您具有以下内容(作为数组属性):

[x0: 61, x1: 900]

因此,每当您使用x0x 比例的第一个 bin 时,例如:

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

...您实际上是在域中引入了一个新值(有关详细说明,请参阅我的回答),因为61x 尺度域中没有

顺便说一句,这个新值在介绍结束域的,尽管非常接近0,这61实际上是最后一跳。

解决方案:

声明unknown

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章