Unable to have two CorePlot graphs show simultaneously

时间秒杀一切 提交于 2019-12-12 15:16:20

问题


I'm having an issue having two different CorePlot graphs show up in the same view. I've set up two hosting views in my view and all the referencing outlets are connected correctly. Only one of the graphs shows up correctly. Adding a quick NSLog to the numberForPlot method shows that only the first graph is being populated (graph and graphView) and not the second (trend and trendView). Here's the code:

- (void) graphSetup {
    CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];

    graph = (CPTXYGraph *)[theme newGraph]; 

    graphView.hostedGraph = graph;
    graphView.allowPinchScaling = YES;

    graph.paddingLeft = -5;
    graph.paddingTop = 0;
    graph.paddingRight = -5;
    graph.paddingBottom = -5;
    graph.fill = nil;
    graph.plotAreaFrame.fill = nil;
    int a = 0;
    for (int i = 0; i < [romAveragesArray count]; i++) {
        if ([romAveragesArray objectAtIndex:i] != NULL)
            a++;
    }

    int localMax = 0;
    int localMin = 0;

    for (int a = 0; a < [romAveragesArray count]; a++) {
        if ([[romAveragesArray objectAtIndex:a] getValue] > localMax)
            localMax = [[romAveragesArray objectAtIndex:a] getValue];
        else if ([[romAveragesArray objectAtIndex:a] getValue] < localMin)
            localMin = [[romAveragesArray objectAtIndex:a] getValue];
    }

    for (int a = 0; a < [obaAveragesArray count]; a++) {
        if ([[obaAveragesArray objectAtIndex:a] getValue] > localMax)
            localMax = [[obaAveragesArray objectAtIndex:a] getValue];
        else if ([[obaAveragesArray objectAtIndex:a] getValue] < localMin)
            localMin = [[obaAveragesArray objectAtIndex:a] getValue];

    }


    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0)
                                                    length:CPTDecimalFromInt(145)];
    NSLog(@"%d",a);
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0)
                                                    length:CPTDecimalFromInt(localMax+15)];




    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;

    CPTXYAxis *x = axisSet.xAxis;
    x.majorIntervalLength = CPTDecimalFromFloat(10);
    x.minorTicksPerInterval = 2;
    x.borderWidth = 0;
    x.labelExclusionRanges = [NSArray arrayWithObjects:
                              [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-100) 
                                                           length:CPTDecimalFromFloat(300)], 
                              nil];;

    CPTXYAxis *y = axisSet.yAxis;
    y.majorIntervalLength = CPTDecimalFromFloat(10);
    y.minorTicksPerInterval = 1;
    y.labelExclusionRanges = [NSArray arrayWithObjects:
                              [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-100) 
                                                           length:CPTDecimalFromFloat(300)], 
                              nil];





    CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init];
    dataSourceLinePlot.identifier = @"Obama";
    dataSourceLinePlot.dataSource = self;
    CPTMutableLineStyle *style = [CPTMutableLineStyle lineStyle];
    style.lineColor = [CPTColor colorWithComponentRed:0.3215686274509804 green:0.6078431372549019 blue:1.0 alpha:1.0];
    dataSourceLinePlot.dataLineStyle = style;
    [graph addPlot:dataSourceLinePlot];


    CPTScatterPlot *dataSourceLinePlot1 = [[CPTScatterPlot alloc] init];
    dataSourceLinePlot1.identifier = @"Rom";
    dataSourceLinePlot1.dataSource = self;
    CPTMutableLineStyle *style1 = [CPTMutableLineStyle lineStyle];
    style1.lineColor = [CPTColor colorWithComponentRed:0.9803921568627451 green:0.47058823529411764 blue:0.47058823529411764 alpha:1.0];
    dataSourceLinePlot1.dataLineStyle = style1;
    [graph addPlot:dataSourceLinePlot1];
     [self trendSetup];

    [self postStats];

}


- (void) trendSetup {
    CPTTheme *theme1 = [CPTTheme themeNamed:kCPTPlainWhiteTheme];

    trend = (CPTXYGraph *) [theme1 newGraph];
    trendView.allowPinchScaling = YES;
    trendView.hostedGraph = trend;

    trend.paddingLeft = -5;
    trend.paddingRight = -5;
    trend.paddingTop = 0;
    trend.paddingBottom = -5;
    trend.fill =  nil;
    trend.plotAreaFrame.fill = nil;
    int obaMax, localMax;
    for (int i = 0; i < [obaArray count]; i++)
        obaMax += [[obaArray objectAtIndex:i] getValue];

    int romMax;
    for (int i = 0; i < [romArray count]; i++)
        romMax += [[romArray objectAtIndex:i] getValue];

    if (romMax > obaMax)
        localMax = romMax;
    else
        localMax = obaMax;

    CPTXYPlotSpace *trendSpace = (CPTXYPlotSpace *)trend.defaultPlotSpace;
    trendSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0) length:CPTDecimalFromInt(504)];
    trendSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0) length:CPTDecimalFromInt(localMax)];

    CPTXYAxisSet *trendSet = (CPTXYAxisSet *)trend.axisSet;

    CPTXYAxis *trendX = trendSet.xAxis;
    trendX.majorIntervalLength = CPTDecimalFromInt(10);
    trendX.minorTicksPerInterval = 2;
    trendX.borderWidth  = 0;
    trendX.labelExclusionRanges = [NSArray arrayWithObjects:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-100) length:CPTDecimalFromFloat(300)], nil];;

    CPTXYAxis *trendY = trendSet.xAxis;
    trendY.majorIntervalLength = CPTDecimalFromInt(10);
    trendY.minorTicksPerInterval = 2;
    trendY.borderWidth  = 0;
    trendY.labelExclusionRanges = [NSArray arrayWithObjects:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-100) length:CPTDecimalFromFloat(300)], nil];;

    CPTScatterPlot *trendSourceLinePlot = [[CPTScatterPlot alloc] init];
    trendSourceLinePlot.identifier = @"Obama Trend";
    trendSourceLinePlot.dataSource = self;
    CPTMutableLineStyle *style3 = [CPTMutableLineStyle lineStyle];
    style3.lineColor = [CPTColor colorWithComponentRed:0.3215686274509804 green:0.6078431372549019 blue:1.0 alpha:1.0];
    trendSourceLinePlot.dataLineStyle = style3;
    [trend addPlot:trendSourceLinePlot];


    CPTScatterPlot *trendSourceLinePlot1 = [[CPTScatterPlot alloc] init];
    trendSourceLinePlot1.identifier = @"Rom Trend";
    trendSourceLinePlot1.dataSource = self;
    CPTMutableLineStyle *style4 = [CPTMutableLineStyle lineStyle];
    style4.lineColor = [CPTColor colorWithComponentRed:0.9803921568627451 green:0.47058823529411764 blue:0.47058823529411764 alpha:1.0];
    trendSourceLinePlot1.dataLineStyle = style4;
    [trend addPlot:trendSourceLinePlot1];

}

回答1:


Here is something I found not-so-right with your code, and I think this is the reason Eric asked you if both hosting views are visible.

You are creating two CPTXYGraphs one called graph another called trend. I don't know how you set up the Views in Interface Builder, but I would NOT create two CPTXYGraphs. I would add trendSourceLinePlot & trendSourceLinePlot1 to either trend or graph.

I think, what you need to do is to present them in the same CPTXYGraph. So, here is my suggestion...

  1. Remove the following lines in trentSetup

    CPTTheme *theme1 = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
    trend = (CPTXYGraph *) [theme1 newGraph];
    trendView.allowPinchScaling = YES;
    trendView.hostedGraph = trend;
    trend.paddingLeft = -5;
    trend.paddingRight = -5;
    trend.paddingTop = 0;
    trend.paddingBottom = -5;
    trend.fill =  nil;
    trend.plotAreaFrame.fill = nil;
    
  2. Replace ONLY the following lines

    [trend addPlot:trendSourceLinePlot];
    [trend addPlot:trendSourceLinePlot1];
    

    respectively with

    [graph addPlot:trendSourceLinePlot];
    [graph addPlot:trendSourceLinePlot1];
    

It also should speed up the loading process.




回答2:


The graph's Y range was too long. I removed sections from the tick marks section and now it updates promptly.



来源:https://stackoverflow.com/questions/10544680/unable-to-have-two-coreplot-graphs-show-simultaneously

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!