基本上我只能在图表上绘制 1000 个值,但我的数据集经常有超过 1000 个值。
所以......假设我有 3000 个值 - 这很容易,每第三个点都被绘制(如果 i / 3 == 1)。当它是像 2106 这样的数字时呢?我试图均匀地绘制。
for(var i = 0; i < chartdata.node.length; i++){
//something in here
}
基本上我只能在图表上绘制 1000 个值,但我的数据集经常有超过 1000 个值。
所以......假设我有 3000 个值 - 这很容易,每第三个点都被绘制(如果 i / 3 == 1)。当它是像 2106 这样的数字时呢?我试图均匀地绘制。
for(var i = 0; i < chartdata.node.length; i++){
//something in here
}
由于您的数量可能多于或少于 1000 个,因此我会选择这样的东西
var inc = Math.floor(chartdata.node.length / 1000);
if ( inc==0 )
inc=1;
for ( var i=0; i<chartdata.node.length; i+=inc )
{
}
令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 个。不过,这些将均匀分布。
你可以尝试这样的事情(在伪代码中):
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)
,这是您想要的。
如果数据是纯数字的,您可以尝试Typed Arrays。