[英]Better way to scale d3 time axis
我正在尝试使用D3.js画一条线。 它们是在一段时间内间隔采样的样本。 我想用x的时间轴来绘制它们。 数据的每个点都只是数组中的索引,我无法弄清楚如何设置轴,而不必在调用d3.time.scale之前手动重新缩放轴。
有人知道如何清理秤吗?
我的代码片段。 我的实际代码下载了数据,并在不同的时间段绘制了许多线,并在图形中转换了不同的偏移量。
// input data
var start_time = 1352684763;
var end_time = 1352771163;
// data is exactly 100 samples taken between start_time and end_time
var data = [140,141,140,140,139,140,140,140,140,141,139,140,54,0,0,0,0,0,0,0,0,0...]
var y_max = d3.max(data);
// graph
var scale_x = d3.time.scale().domain([start_time, end_time]).range([0, 100]);
var scale_y = d3.scale.linear().domain([0, y_max]).range([height, 0]);
var step = (end_time - start_time)/100;
function re_scale(x) { return start_time + x*step; }
// for x, rescale i (0..99) into a timestamp between start_time and end_time before returning it and letting scale_x scale it to a local position. Awkward.
var line = d3.svg.line()
.x(function(d, i) { return scale_x(re_scale(i)); })
.y(scale_y)
.interpolate('basis')
var g = graph.selectAll("g")
.append('svg:path')
.attr('d', function(d) { return line(data); })
// also draw axis here...
“域”应指数据中的跨度,“范围”应指屏幕上的跨度。
目前,它将.range([0, 100])
解释为许多像素。 如果将其更改为.range([0, width])
它应该工作而无需重新缩放。
d3.time.scale()只需要知道起点和终点即可产生一个良好的轴。 但是,如果您确实希望为每个数据点都打勾,则可以在docs中执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.