График Core-Plot, на котором нет точек данных - PullRequest
0 голосов
/ 20 сентября 2011

Мне удалось получить оси для отображения стандартного графика основного графика, но у меня возникли некоторые проблемы с добавлением к нему точек.

У меня есть эти два метода, объявленные вФайл .m (найден по другому вопросу на этом сайте):

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot;


-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:

Итак, в начале этого файла controller.m у меня есть это:

NSArray *myDataArray;

Наконец, вметод viewDidLoad (по-прежнему файл .m), ближе к концу (после создания графика) у меня есть массив с настроенными точками.

При сборке и запуске XCode выдает 0 ошибок или предупреждений, ноточки не отображаются на графике.

Буду признателен за любую помощь, спасибо!

1 Ответ

2 голосов
/ 20 сентября 2011

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

В вашем методе numberForPlot попробуйте что-то вроде следующего:

- (NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { 
    if (fieldEnum == CPScatterPlotFieldX) {
        // should return data for x axis point;
        return [[myDataArray objectAtIndex:index] objectAtIndex:index];
    }
    else {
        // y axis point;
        return [NSDecimalNumber numberWithInt:index];
    }
}

Я прошу прощения, если это довольно грубо.Я просто переписал немного с гистограммы, чтобы разбросать график.Но это должно сработать.Я думаю, проблема была в том, что ты звонил objectAtIndex:fieldEnum.Это немного запутало меня, когда я впервые начал использовать CorePlot.Опять же, если это не поможет, просто скажите, и мы попробуем что-то новое.Но я считаю, что это должно сделать это, или что-то очень похожее.

РЕДАКТИРОВАТЬ: В примере кода, предоставляемого с CorePlot, вот код для самих данных:

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {
    NSDecimalNumber *num = nil;
    if ( [plot isKindOfClass:[CPPieChart class]] ) {
        if ( index >= [self.dataForChart count] ) return nil;

        if ( fieldEnum == CPPieChartFieldSliceWidth ) {
            num = [self.dataForChart objectAtIndex:index];
        }
        else {
            num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
        }
    }
    else if ( [plot isKindOfClass:[CPBarPlot class]] ) {
        switch ( fieldEnum ) {
        case CPBarPlotFieldBarLocation:
            if ( index == 4 ) {
                num = [NSDecimalNumber notANumber];
            }
            else {
                num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
            }
            break;
        case CPBarPlotFieldBarTip:
            if ( index == 8 ) {
                num = [NSDecimalNumber notANumber];
            }
            else {
                num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:(index+1)*(index+1)];
                if ( [plot.identifier isEqual:@"Bar Plot 2"] ) {
                    num = [num decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithString:@"10"]];
                }
            }
            break;
        }
    }
    else {
        if ( index % 8 ) {
            num = [[dataForPlot objectAtIndex:index] valueForKey:(fieldEnum == CPScatterPlotFieldX ? @"x" : @"y")];
            // Green plot gets shifted above the blue
            if ( [(NSString *)plot.identifier isEqualToString:@"Green Plot"] ) {
                if ( fieldEnum == CPScatterPlotFieldY ) {
                    num = (NSDecimalNumber *)[NSDecimalNumber numberWithDouble:[num doubleValue] + 1.0];
                }
            }
        }
        else {
            num = [NSDecimalNumber notANumber];
        }
    }
    return num;
}

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

NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100];
NSUInteger i;
for ( i = 0; i < 60; i++ ) {
    id x = [NSNumber numberWithFloat:1+i*0.05];
    id y = [NSNumber numberWithFloat:1.2*rand()/(float)RAND_MAX + 1.2];
    [contentArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]];
}
self.dataForPlot = contentArray;

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

...