我有这段代码: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来自哪里(它是数据的第一个值),但我看不到它是如何在轴上结束的。
注意轴上的第一个值......你能否解释一下这个问题?
答案 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