如何在CorePlot中绘制多个图表

4

我需要在同一张图中以不同时机绘制多个图表。请看下面的图片:

需要这样的图表

不同的是,图表数量会动态变化。有时我只需要蓝色和橙色数据集,有时需要全部四个,有时只需要3个。我已经可以处理一个条形图。

CPTScatterPlot *plot = [[[CPTScatterPlot alloc] init] autorelease];
plot.dataSource = self;
plot.identifier = @"mainplot";
plot.dataLineStyle = lineStyle;
plot.plotSymbol = plotSymbol;
[self.graph addPlot:plot];  

在我的情况下,我可以将它们放在一个for循环中,并在每次迭代中执行[self.graph addplot:plot]。但是,如何管理数据源?如果数据集的数量动态变化,如何管理以下代码?
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {
    if ( [plot.identifier isEqual:@"mainplot"] )
    {
        NSValue *value = [self.graphData objectAtIndex:index];
        CGPoint point = [value CGPointValue];

        // FieldEnum determines if we return an X or Y value.
        if ( fieldEnum == CPTScatterPlotFieldX )
        {
            return [NSNumber numberWithFloat:point.x];
        }
        else    // Y-Axis
        {
            return [NSNumber numberWithFloat:point.y];
        }
    }

    return [NSNumber numberWithFloat:0];
}  
2个回答

2

我之前做过,它奏效了!你可以使用一个NSArray来表示绘图,并创建一些绘图数据并将其作为对象添加到NSDictionary中。详情请参见此示例:

NSDictionary *firstLineDic = [NSDictionary dictionaryWithObjectsAndKeys:@"firstLine", PLOT_IDENTIFIER, firstLineData, PLOT_DATA, nil];
NSDictionary *secondLineDic = [NSDictionary dictionaryWithObjectsAndKeys:@"secondLine", PLOT_IDENTIFIER, secondLineData, PLOT_DATA, nil];
NSArray *arrayData = [NSArray arrayWithObjects:firstLineDic, secondLineDic, nil];
scatterPlot = [[ScatterPlot alloc] initWithHostingView:plotView data:arrayData];
[scatterPlot initialisePlot];

现在在ScatterPlot类中编写以下函数:
-(id)initWithHostingView:(CPTGraphHostingView *)_hostingView data:(NSArray *)_data{
    self = [super init];
    if ( self != nil ) {
        self.hostingView = _hostingView;
        data = [[NSArray alloc] initWithArray:_data];
        self.graph = nil;
    }
    return self;
}

-(void)initialisePlot
{

...

    for (NSDictionary *dic in data) {
        CPTScatterPlot *plot = [[[CPTScatterPlot alloc] init] autorelease];
        plot.dataSource = self;
        plot.identifier = [dic objectForKey:PLOT_IDENTIFIER];
        plot.dataLineStyle = [lineStyles objectAtIndex:[dic objectForKey:PLOT_COLOR]];
        plot.plotSymbol = plotSymbol;
        [self.graph addPlot:plot];
    }

...

}

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{
    for (NSDictionary *dic in data) {
        NSString *identity = [dic objectForKey:PLOT_IDENTIFIER];
        if([plot.identifier isEqual:identity]){
            NSArray *arr = [dic objectForKey:PLOT_DATA];
            return [arr count];
        }
    }
    return 0;
}

如果我不知道我将有多少行代码,你有什么建议吗? - Boris Gafurov
@BorisGafurov 使用NSMutableArray替代NSArray来处理PLOT_DATA - Hamed Rajabi Varamini

0
检查不同的图形标识符,并返回其他数据。

嗨,MrMage,感谢您的快速回复,您能告诉我如何分配动态标识符吗?更难的问题是如何在if循环中比较它们,例如([plot.identifier isEqual:@"mainplot"])。在上面的示例中,@"mainplot"是硬编码的。我该如何将其更改为动态的? - Rajashekar
如果你稍微想一下,我相信你能够自己解决这个问题。 - MrMage
我正在尽力猜测。CPTPlot *tempPlot = [self.graph objectatindex:indexpath.row]; 如果 ( [plot.identifier isEqual:tempPlot.identifier] ) // 我确定 self.graph 不会采用 objectatindex 方法。我想知道它可以采用哪种方法? - Rajashekar
标识符声明为 id <NSCopying,NSCoding,NSObject> 。它不一定是字符串。简单的方法是将索引编码为 NSNumber 并将其用作标识符。 - Eric Skroch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接