Как нарисовать несколько графиков в coreplot - PullRequest
4 голосов
/ 18 марта 2012

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

Need graph like this

За исключением того, что количество участков будет изменяться динамически.Иногда мне потребовались бы только синие и оранжевые наборы данных несколько раз каждые четыре, а иногда только 3. Я могу управлять одним гистограммой, как это.

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

В моем случае я могу поместить их вдля цикла и делать [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 голосов
/ 13 июня 2012

Я делал это раньше, и это сработало!Вы можете использовать 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;
}
0 голосов
/ 18 марта 2012

Проверьте различные идентификаторы графика и затем верните другие данные.

...