Graph 简化D3.js面积图中绘制的时间序列JSON数据

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.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 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个点的新数组。我看看。