【问题标题】:how to draw multiple plots in coreplot如何在coreplot中绘制多个图
【发布时间】:2012-03-18 10:54:49
【问题描述】:

我需要在不同时间在同一张图中绘制多个图。请看下图:

除了地块的数量会动态变化。有时我只需要蓝色和橙色数据集,有时是全部四个,有时只需要 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];
}  

【问题讨论】:

    标签: core-plot


    【解决方案1】:

    我之前做过,它成功了!您可以将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;
    }
    

    【讨论】:

    • 如果我不知道我将有多少行?有什么建议吗?
    • @BorisGafurov 使用NSMutableArray而不是NSArray 来代替PLOT_DATA
    【解决方案2】:

    检查不同的绘图标识符,然后返回其他数据。

    【讨论】:

    • 嗨 MrMage,感谢您的快速回复,您能告诉我如何分配动态标识符吗?更棘手的问题是如何在 if 循环中比较它们 if ( [plot.identifier isEqual:@"主情节"])。在上面的示例中,@“mainplot”是硬编码的。我将如何将其更改为动态的。
    • 我相信如果你想一想,你自己就能弄清楚。
    • 我给出了我最好的猜测。 CPTPlot *tempPlot = [self.graph objectatindex:indexpath.row]; if ( [plot.identifier isEqual:tempPlot.identifier] ) // 我确信 self.graph 不会采用 objectatindex 方法。我想知道它可以采取什么方法?
    • 标识符声明为id<NSCopying, NSCoding, NSObject>。它不一定是字符串。一种简单的方法是将索引编码为 NSNumber 并将其用作标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多