Objective-C: гладкий NSArray объектов NSNumber - PullRequest
1 голос
/ 14 октября 2011

У меня есть NSArray, который содержит большое количество объектов NSNumber (тысячи).Я использую эти числа, чтобы построить хороший линейный график.Проблема в том, что график использует каждое значение, что делает график очень резким.Это становится еще хуже, чем больше у меня значений:

enter image description here

Я хочу иметь возможность сделать это в более гладкий график, возможно, выбрасывая те числа, которые делают его неровным.Я хочу, чтобы это выглядело так:

enter image description here

Возможно, уже поздно, но я не думаю о способе сделать это.Возможно, просматривая мои ценности и выбрасывая некоторые из них?График не должен быть точным на 100%, он просто должен быть достойным представлением значений.

РЕДАКТИРОВАТЬ:

Вот метод, который япридумал, используя ответ Джртуртона:

- (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

Работало отлично!

Ответы [ 4 ]

3 голосов
/ 14 октября 2011

Вы можете взять среднее значение каждых 10 (или что бы вы ни выбрали) элементов в массиве и использовать его для определения точек на графике. Это также ускорит процесс рисования.

3 голосов
/ 14 октября 2011

Посмотрите на скользящие средние.

Чем короче скользящая средняя, ​​тем ближе она обнимает кривую, но сглаживает ее.

Например, посмотрите 10-дневную экспоненциальную скользящую среднюю здесь:

http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

1 голос
/ 14 октября 2011

Раньше мне никогда не приходилось делать ничего подобного, поэтому я уверен, что другие могут придумать более изящные решения, но вот что я бы попробовал:

Перед отображением графика, вместо того, чтобы выбрасывать некоторые элементы, почему бы вам не установить для каждого элемента среднее значение некоторых элементов вокруг него? Например, если ваш массив содержит (2, 1, 3, 5, 4, 3, 8), он превратится в (2, 2, 3, 4, 4, 5, 8). Чтобы получить эти значения, я взял среднее значение каждого элемента и его непосредственных соседей, чтобы получить новый элемент (за исключением конечных пробок, которые я оставил как есть). Играя с количеством элементов, которые вы усредняете вместе на каждом шаге, ваш график будет выглядеть так гладко, как вы этого хотите.

0 голосов
/ 14 октября 2011
...