Graph 简化D3.js面积图中绘制的时间序列JSON数据
我们使用D3.js在堆积面积图上显示时间序列数据(利用计算资源,每个月每小时采样一次):Graph 简化D3.js面积图中绘制的时间序列JSON数据,graph,d3.js,time-series,simplify,data-manipulation,Graph,D3.js,Time Series,Simplify,Data Manipulation,我们使用D3.js在堆积面积图上显示时间序列数据(利用计算资源,每个月每小时采样一次): d3.json("/growth/instance_count_1month.json", function( data ) { data.forEach(function(d) { d.datapoints = d.datapoints.map( function(da) { // NOTE i'm not sure why this need
d3.json("/growth/instance_count_1month.json", function( data ) {
data.forEach(function(d) {
d.datapoints = d.datapoints.map(
function(da) {
// NOTE i'm not sure why this needs to be multiplied by 1000
return {date: new Date(da[1] * 1000),
count: da[0]};
});
});
x.domain(d3.extent(data[0].datapoints, function(d) { return d.date; }));
y.domain([0,
Math.ceil(d3.max(data.map(function (d) {return d3.max(d.datapoints, function (d) { return d.count; });})) / 100) * 100
]);
结果对我的口味来说相当刺耳:
是否有一种简单的方法来简化数据,使用D3或其他现成的库?我想减少尖峰,但同时也要减少要绘制的数据量,因为这将无法控制
我更倾向于在UI级别执行此操作,而不是触及日志例程(即使必须传输冗余的JSON数据)。您有许多选择,您需要决定针对您所拥有的数据类型和所使用数据的需求,最好的解决方法是什么。在不了解更多数据的情况下,我建议最好是重新采样。只需以更长的时间间隔报告数据(“汇总”数据)。或者,您可以使用滚动平均值或查看各种直线平滑算法 这不是你问题的答案(我想到的是过滤),但这里有一个非常好的例子,可以使用平滑时间序列数据。它是建立在D3之上的开放源代码。您可以从使用的线条/区域开始玩转。@ChristopherHackett,例如,要开始的数据的实际记录,或者它是如何传递到javascript接口的。@LarsKotthoff:是的,但是当数据点多于像素时,这并没有任何实际的区别。没有什么可以插值的。@FernOfTheAndes:是的,这就是我希望看到的样子:)以更长的间隔采样并没有真正起作用:比如说,我总是希望图形中有50个X点,而不管时间段如何。你不会事先知道采样间隔应该是多少(它会改变)。如果你总是想要50个点,那么你描述的是数据的某种分段线性近似。是的。可能有一种方法可以使用D3的插值函数从旧数组中构建一个包含50个点的新数组。我看看。