我已经能够显示标准核心图的轴,但是我实际上在为它添加点时遇到了一些麻烦。
我在.m文件中声明了这两个方法(从本网站的另一个问题中找到):
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot;
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:
所以,在那个controller.m文件的顶部,我有这个:
NSArray *myDataArray;
最后,在viewDidLoad方法(仍然是.m文件)中,接近结尾(创建图形之后),我有一个设置了点的数组。
当我构建并运行时,XCode会给出0个错误或警告,但这些点不会显示在图表上。
感谢任何帮助,谢谢!
答案 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;
所以也许如果你尝试这样的格式,它可以工作。如果这不起作用,那么我们知道图形创建本身而不是数据
是一个问题