我正在创建一个带有d3的柱形图。我有263个数据点,并显示所有列使图表太拥挤。要过滤数据点,我只需抓住每个第n项(从数组的反面开始,所以我确保得到最新的数据点)。
我定义y轴刻度值以包含未过滤数据集中的最小值和最大值,因此用户可以看到真实数据集的最小值和最大值。我在过滤数据之前计算最小值和最大值:
var v = new Array();
data.forEach(function (d) {
d.date = parseDate(d.date);
d.close = +d.close;
v.push(d.close); // v holds ALL our values...before we filter them
});
yAxisValues = [Math.min.apply(null, v),Math.max.apply(null, v)];
if(data.length > 100){ // make it so that the chart isn't as crowded
var len = data.length;
var n = Math.round(len/100); // ideally, we want no more than 100 items
var tempData = [];
data = data.reverse();
for( var k = 0; k < len; k += n ){
tempData.push( data[ k ] );
}
data = tempData;
data = data.reverse();
}
然而,现在我的y轴被拧紧,-0.02显示在x轴下方。我做错了什么?我的fiddle。 (要查看y轴正常运行,只需注释掉我过滤数据的部分)
答案 0 :(得分:1)
您是在过滤前创建Y轴值,但仍在过滤数据上创建比例:
var y = d3.scale.linear().range([height - 5, 5]);
// here is where it look at the min/max of the filtered data rather than the min/max of the original
y.domain(d3.extent(data, function (d) {
return d.close;
}));
var yAxis = d3.svg.axis().scale(y).orient('left').tickValues(yAxisValues);
如果在过滤之前移动此部分,则应该没问题。