我有一个包含大量NSNumber对象(数千个)的NSArray。我使用这些数字来构建一个漂亮的折线图。问题是,图表使用了每个值,这使得图表非常清晰。我拥有的价值越多,情况就越糟糕:
我希望能够将它变成更平滑的图形,可能会抛出那些让它看起来像锯齿状的数字。我希望它看起来像这样:
也许已经晚了,但我并没有想办法做到这一点。可能会循环我的价值观并把它们中的一些扔出去?图表不需要100%准确,它只需要是值的正确表示。
修改
这是我使用jrturton的答案提出的方法:
- (NSArray *)smoothedArray:(NSArray *)items {
int average = 0;
int i = 0;
int numberToAverageBy = 10;
NSMutableArray *newItems = [[[NSMutableArray alloc] init] autorelease];
// Loop
for (NSNumber *elevation in items) {
average += [elevation intValue];
i++;
if (i == numberToAverageBy) {
[newItems addObject:[NSNumber numberWithInt:average/numberToAverageBy]];
i = 0;
average = 0;
}//end
}//end for
return [NSArray arrayWithArray:newItems];
}//end
它完美无缺!
答案 0 :(得分:3)
查看移动平均线。
移动平均线越短,它越接近曲线,但它会平滑。
例如,在这里查看10天指数移动平均线:
http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
答案 1 :(得分:3)
您可以获取数组中每10个(或您选择的任何)元素的平均值,并使用它来确定要绘制的点。这样可以使绘图更快。
答案 2 :(得分:1)
我以前从来没有做过这样的事情,所以我相信其他人可以提出更优雅的解决方案,但这就是我想要的尝试:
在显示图形之前,为什么不将每个元素设置为它周围某些元素的平均值,而不是丢弃一些元素?例如,如果您的数组包含(2,1,3,5,4,3,8),那么它将变为(2,2,3,4,4,5,8)。为了获得这些值,我取每个元素及其直接邻居的平均值来获得新元素(除了endcaps,我保留原样)。在每个步骤中使用您平均在一起的元素数量,可以使图形看起来像您想要的那样平滑。
答案 3 :(得分:0)