Core-Plot: наносить только одну точку на Scatterplot? - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть график с двумя графиками.Один график показывает 10 точек данных и является статичным.На втором графике должна отображаться только одна точка данных, которая является функцией выбора ползунка.

Однако всякий раз, когда я перемещаю ползунок для вычисления координат отдельной точки данных, график генерирует целую серию точек доЯ перестаю скользитьЯ хотел бы убрать этот след из точек и показать только тот, который представлен стоп-ползунком.Надеюсь, что это имеет смысл.

Вот как выглядит график (ошибочно):

Ой, я слишком новичок, чтобы опубликовать изображение, но я уверен, что вы получите изображение.

Вот часть кода в ползунке IBAction:

CPTScatterPlot *dotPlot = [[[CPTScatterPlot alloc] init] autorelease];
dotPlot.identifier = @"Blue Plot";
dotPlot.dataSource = self;
dotPlot.dataLineStyle = nil;
[graph addPlot:dotPlot];

NSMutableArray *dotArray = [NSMutableArray arrayWithCapacity:1];
NSNumber *xx = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]];
NSNumber *yy = [NSNumber numberWithFloat:[estMonthYield.text floatValue]];
[dotArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:xx,@"x",yy,@"y", nil]];

CPTMutableLineStyle *dotLineStyle = [CPTMutableLineStyle lineStyle];
dotLineStyle.lineColor = [CPTColor blueColor];
CPTPlotSymbol *yieldSymbol = [CPTPlotSymbol ellipsePlotSymbol];
yieldSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]];
yieldSymbol.size = CGSizeMake(10.0, 10.0);
dotPlot.plotSymbol = yieldSymbol;

self.dataForPlot = dotArray;

Я пытался перезагрузить график с помощью [dotPlot reloadData] и даже пытался удалить и добавить точку dotPlotно ни один из них не работает или, возможно, я помещаю инструкции в неправильном месте или в неправильной последовательности.

Любой совет будет принят с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Я подумал, что у меня на расстоянии строки кода от решения. Как обычно бывает, я мечтал о решении. Сначала я удалил весь код NSMutableArray * dotArray и т. Д. И т. Д. Из метода слайдера. Во-вторых, я сохранил [graph reloadData] в методе слайдера, как советовал Flyingdiver. В-третьих, я изменил методы источника данных следующим образом:

#pragma mark - Plot datasource methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [dataForPlot count];
}
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:     (NSUInteger)index { 
    NSNumber *num = [[dataForPlot objectAtIndex:index] valueForKey:(fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y")];
    // Blue dot gets placed above the red actual yields
    if ([(NSString *)plot.identifier isEqualToString:@"Blue Plot"]) {
        if (fieldEnum == CPTScatterPlotFieldX) {
            num = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]]; }
        if (fieldEnum == CPTScatterPlotFieldY) {
        num = [NSNumber numberWithFloat:[estMonthYield.text floatValue]]; }
    }
    return num;
}

Еще раз, спасибо миллиону Flyingdiver за подсказки, разгадавшие мою тайну. Я многому научился.

1 голос
/ 27 сентября 2011

Почему вы воссоздаете диаграмму рассеяния в действии слайдера?Единственное, что вам нужно сделать в этом методе, это обновить массив, который предоставляет данные для второго графика, и вызвать reloadData.

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

NSMutableArray *dotArray = [NSMutableArray arrayWithCapacity:1];
NSNumber *xx = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]];
NSNumber *yy = [NSNumber numberWithFloat:[estMonthYield.text floatValue]];
[dotArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:xx,@"x",yy,@"y", nil]];
self.dataForPlot = dotArray;

[graph reloadData];
...