0

基本上我只能在图表上绘制 1000 个值,但我的数据集经常有超过 1000 个值。

所以......假设我有 3000 个值 - 这很容易,每第三个点都被绘制(如果 i / 3 == 1)。当它是像 2106 这样的数字时呢?我试图均匀地绘制。

for(var i = 0; i < chartdata.node.length; i++){
  //something in here
}
4

4 回答 4

2

由于您的数量可能多于或少于 1000 个,因此我会选择这样的东西

var inc = Math.floor(chartdata.node.length / 1000);

if ( inc==0 )
   inc=1;

for ( var i=0; i<chartdata.node.length; i+=inc )
 { 
 }
于 2013-07-03T22:15:22.870 回答
1

正好 1000 点,间距稍有不规则

A为您拥有的数据点数(即 2106),B为您想要使用的数据点数(即 1000)。在连续情况下,您将在每个A/B数据点处放置绘图点。对于离散数据点,您可以执行以下操作:维护一个计数器C,初始化为零。对于每个A输入数据点,您将B添加到该计数器。如果结果值大于A,则绘制数据点并从计数器中减去A。总体而言,您将添加值BA次,并减去AB次,所以你应该再次得到一个零计数器,准确地绘制了B个数据项。

您可以对其进行调整以在端点获得不同的行为,例如始终包含第一个和最后一个数据点。只需无条件地绘制第一个点,然后对其余点执行上述方案,即 A=2105 和 B=999。整个方法的一个好处是所有这些都在整数算术中工作,因此舍入误差对您来说无关紧要。

完全规则的间距,但更少的数据点

如果甚至间距更重要,那么您可以使用 floor( A/B )简单地计算要为每个图增加索引的数量。由于 floor 函数,这将是一个小于分数结果的数字。在最坏的情况下,几乎是2 的数字将被舍入到 1,导致实际绘制的数据点仅略多于 500 个。不过,这些将均匀分布。

于 2013-07-03T22:14:01.310 回答
0

你可以尝试这样的事情(在伪代码中):

var desired_data_length = 1000;
for (var i = 0; i < desired_data_length; i++)
{
    var actual_i = int(float(i) / float(desired_data_length) * float(chartdata.length));
    // do something with actual_i as the index
}

这将使用desired_data_length索引数量,并将从[0,desired_data_length)to线性插值[0,chartdata.length),这是您想要的。

于 2013-07-03T22:11:15.257 回答
0

如果数据是纯数字的,您可以尝试Typed Arrays

于 2013-07-03T22:23:56.800 回答