有几件小事让你大吃一惊。首先,x0 比例的域应该是一个日期时间对象数组,而不是字符串数组:
x0.domain(data.days.map(function(d) {
var str = d.modified;
d.date = parseDate( str.substring(0, str.length - 3) );
return d.date;
}));
将返回日期时间,而不是像以前那样的字符串(轻微的挑剔:真的不喜欢这种用法map
,我会在加载数据时在 forEach 函数中单独添加 date 属性)。
其次,x0 需要传递一个实际存在的属性:
var state = svg.selectAll(".state")
.data(data.days)
.enter().append("g")
.attr("class", "g")
.attr("transform", function(d) { return "translate(" + x0(d.date) + ",0)"; });
以前,您使用x0(d.state)
的是分组栏示例的遗迹(其他几个仍然存在;我已经更改了最低限度以使您的项目正常工作)。由于该值不存在,所有矩形都被相互绘制。
此外,我们需要格式化轴标签,这样我们就不会在标签上打印出整个日期时间对象:
var xAxis = d3.svg.axis()
.scale(x0)
.orient("bottom")
.tickFormat(d3.time.format("%m-%d"));
最后,我注意到最新的日期被打印在左边而不是右边。你可以对结果进行排序data.days.map( ... )
来解决这个问题,我只是颠倒了 x0 的范围:
var x0 = d3.scale.ordinal()
.rangeRoundBands([width, 0], .1);
固定文件