在 d3.js 中绘制滚动/移动平均线
Plot rolling/moving average in d3.js
寻找一种在 d3 中绘制滚动/移动平均线的方法,而无需事先操作数据。因此,我想通过平均每个数据点来平滑这条线,并在它后面有两个数据点。我的代码是这样的
var data = [3, 66, 2, 76, 5, 20, 1, 3, 8, 90, 2, 5, 70];
var w = 20,
h = 80;
var x = d3.scale.linear()
.domain([0, 1])
.range([0, w]);
var y = d3.scale.linear()
.domain([0, 100])
.rangeRound([h, 0]);
var chart = d3.select("body").append("svg")
.attr("class", "chart")
.attr("width", w * data.length -1)
.attr("height", h);
var line = d3.svg.line()
.x(function(d,i) { return x(i); })
.y(function(d) { return y(d); })
var movingAverageLine = d3.svg.line()
.x(function(d,i) { return x(i); })
.y(function(d) { return y(d); })
chart.append("svg:path").attr("d", line(data));
chart.append("svg:path").attr("d", movingAverageLine(data));
我可以指定移动平均线来计算以下数据点的平均值吗?我想不出在该函数中访问它们的方法。
我在jsfiddle上设置了一个示例。 http://jsfiddle.net/tjjjohnson/XXFrg/2/#run
以前的解决方案会产生累积移动平均线。
我修改了John O'Connor的小提琴,通过将自定义插值函数传递给d3.svg.line()
来提供n移动平均线:
movingAvg = function(n) {
return function (points) {
points = points.map(function(each, index, array) {
var to = index + n - 1;
var subSeq, sum;
if (to < points.length) {
subSeq = array.slice(index, to + 1);
sum = subSeq.reduce(function(a,b) {
return [a[0] + b[0], a[1] + b[1]];
});
return sum.map(function(each) { return each / n; });
}
return undefined;
});
points = points.filter(function(each) { return typeof each !== 'undefined' })
// Note that one could re-interpolate the points
// to form a basis curve (I think...)
return points.join("L");
}
}
var movingAverageLine = d3.svg.line()
.x(function(d,i) { return x(i); })
.y(function(d,i) { return y(d); })
.interpolate(movingAvg(6));
下面的行函数应该做你想要的。基于 http://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average 的公式。
var _movingSum;
var movingAverageLine = d3.svg.line()
.x(function(d,i) { return x(i); })
.y(function(d,i) {
if (i == 0) {
return _movingSum = 0;
} else {
_movingSum += d;
}
return y(_movingSum / i);
})
.interpolate("basis");
http://jsfiddle.net/XXFrg/12/
不确定"滚动平均值"是什么意思,但如果您只想有一条显示数据平均值的线,这里有一种方法:
chart.append("svg:line")
.attr("x1", x(0))
.attr("x2", x(1))
.attr("y1", d3.mean(data))
.attr("y2", d3.mean(data))
.style('stroke', 'blue')
.style('stroke-width', 1)
你可以在这里看到jsfiddle:http://jsfiddle.net/XXFrg/3/。 希望有帮助,
相关文章:
- css停止图像在滚动中移动
- 背景图像顶部的滚动图像不移动
- javascript移动交叉浏览器确定用户是否滚动到页面底部
- 动态添加/创建的移动滚动条无法正常工作
- 如何设置移动滚动的最大值日期
- Facebook找到了一种解决移动滚动的方法
- Kendo UI移动滚动程序错误
- 移动滚动无法使用fullpage.js和wow.js
- 溢出时移动滚动方向检测:隐藏页面
- 元素如果在mcustomscrollbar中拖动,则不会向下移动滚动条
- jquery scrollTop工作,但不移动滚动条
- Jquery-在特定时间后自动移动滚动条到特定位置
- jQuery移动滚动/页面切断问题的多页模板
- 移动滚动条时,始终将窗口保持在中心位置
- 不能在iframe内移动滚动条
- 扩展预览关闭移动滚动
- Jquery移动滚动到底部的新页面
- 移动滚动日期选择器被jQuery移动模式隐藏
- 用鼠标移动滚动
- 剑道UI下拉列表移动滚动