Core-Plot图表未显示任何数据点

时间:2011-09-20 16:29:23

标签: iphone objective-c xcode graph core-plot

我已经能够显示标准核心图的轴,但是我实际上在为它添加点时遇到了一些麻烦。

我在.m文件中声明了这两个方法(从本网站的另一个问题中找到):

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


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

所以,在那个controller.m文件的顶部,我有这个:

NSArray *myDataArray;

最后,在viewDidLoad方法(仍然是.m文件)中,接近结尾(创建图形之后),我有一个设置了点的数组。

当我构建并运行时,XCode会给出0个错误或警告,但这些点不会显示在图表上。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

我认为在评论中阅读会太混乱,所以我想回答。

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;

所以也许如果你尝试这样的格式,它可以工作。如果这不起作用,那么我们知道图形创建本身而不是数据

是一个问题