在coreplot

时间:2017-08-20 21:08:50

标签: ios xcode core-plot

我的x轴刻度线标签似乎自己消失了。有时他们会在看不见的情况下表现得很好。我认为它有一些事情要做我的数据扩展,但我已经尝试了很多东西,我可以修复它。我的代码遵循(我几乎直接从其中一个复制它 例子)。我的价值观都是积极的。  如果您有任何建议,请告诉我。 感谢。

-(void)configureHostFour {
    self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
    self.hostView.allowPinchScaling = YES;
    [self.myViewFour addSubview:self.hostView];
    CPTGraphHostingView *BarGraphView = [[CPTGraphHostingView alloc] init];
    self.hostView.frame = CGRectMake(self.myViewFour.bounds.origin.x, self.myViewFour.bounds.origin.y, self.myViewFour.bounds.size.width, self.myViewFour.bounds.size.height);
    [self.hostView addSubview:BarGraphView];
}

-(void)configureGraphFour {
    // 1 - Create the graph
    CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:self.hostView.bounds];
    //        [graph applyTheme:[CPTTheme themeNamed:kCPTSlateTheme]];
    [graph applyTheme:[CPTTheme themeNamed:kCPTPlainWhiteTheme]];

    self.hostView.hostedGraph = graph;
    // 2 - Set graph title
    NSString *title = @"Heart Rate";
    graph.title = title;
    // 3 - Create and set text style
    CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle];
    titleStyle.color = [CPTColor blackColor];
    titleStyle.fontName = @"Helvetica-Bold";
    titleStyle.fontSize = 12.0f;
    graph.titleTextStyle = titleStyle;
    graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
    graph.titleDisplacement = CGPointMake(0.0f, 17.0f);
    // 4 - Set padding for plot area
    [graph.plotAreaFrame setPaddingLeft:1.0f];
    [graph.plotAreaFrame setPaddingBottom:1.0f];
    // 5 - Enable user interactions for plot space
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
    plotSpace.allowsUserInteraction = YES;
}

-(void)configurePlotsFour {
    // 1 - Get graph and plot space
    CPTGraph *graph = self.hostView.hostedGraph;
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;

    // 2 - Create the plots
    CPTScatterPlot *hrPlot = [[CPTScatterPlot alloc] init];
    hrPlot.dataSource = self;
    hrPlot.identifier = hrSCORE;
    CPTColor *hrColor = [CPTColor blueColor];
    [graph addPlot:hrPlot toPlotSpace:plotSpace];

    CPTScatterPlot *avghrPlot = [[CPTScatterPlot alloc] init];
    avghrPlot.dataSource = self;
    avghrPlot.identifier = hrSCOREAVG;
    CPTColor *avghrColor = [CPTColor redColor];
    [graph addPlot:avghrPlot toPlotSpace:plotSpace];


    // 3 - Set up plot space
    [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:hrPlot, avghrPlot, nil]];
    CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy];
    [xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.1f)];
    plotSpace.xRange = xRange;
    CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy];
    [yRange expandRangeByFactor:CPTDecimalFromCGFloat(1.2f)];
    plotSpace.yRange = yRange;

    // 4 - Create styles and symbols
    CPTMutableLineStyle *hrLineStyle = [hrPlot.dataLineStyle mutableCopy];
    hrLineStyle.lineWidth = 2.0;
    hrLineStyle.lineColor = hrColor;
    hrPlot.dataLineStyle = hrLineStyle;
    CPTMutableLineStyle *hrSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    hrSymbolLineStyle.lineColor = hrColor;

    CPTMutableLineStyle *avghrLineStyle = [hrPlot.dataLineStyle mutableCopy];
    avghrLineStyle.lineWidth = 2.0;
    avghrLineStyle.lineColor = avghrColor;
    avghrPlot.dataLineStyle = avghrLineStyle;
    CPTMutableLineStyle *avghrSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    avghrSymbolLineStyle.lineColor = avghrColor;

}

-(void)configureAxesFour{
    // 1 - Create styles
    CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
    axisTitleStyle.color = [CPTColor blackColor];
    axisTitleStyle.fontName = @"Helvetica-Bold";
    axisTitleStyle.fontSize = 10.0f;
    CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
    axisLineStyle.lineWidth = .01f;
    axisLineStyle.lineColor = [CPTColor blackColor];

    CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
    axisTextStyle.color = [CPTColor blackColor];
    axisTextStyle.fontName = @"Helvetica-Bold";
    axisTextStyle.fontSize = 9.0f;
    CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
    tickLineStyle.lineColor = [CPTColor blackColor];
    tickLineStyle.lineWidth = 1.0f;
    CPTMutableLineStyle *gridLineStyle = [CPTMutableLineStyle lineStyle];
    tickLineStyle.lineColor = [CPTColor blackColor];
    tickLineStyle.lineWidth = 1.0f;
    // 2 - Get axis set
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;
    // 3 - Configure x-axis
    CPTAxis *x = axisSet.xAxis;
    x.title = @"Day of Month";
    x.titleTextStyle = axisTitleStyle;
    x.titleOffset = 20.0f;
    x.axisLineStyle = axisLineStyle;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    x.labelTextStyle = axisTextStyle;
    x.majorTickLineStyle = axisLineStyle;
    x.majorTickLength = 4.0f;
    x.tickDirection = CPTSignNegative;

    CGFloat dateCount = [self.dateArray count];
    NSMutableSet *xLabels = [NSMutableSet setWithCapacity:dateCount];
    NSMutableSet *xLocations = [NSMutableSet setWithCapacity:dateCount];
    NSInteger i = 0;
    for (NSString *date in self.dateArray) {
        CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:date  textStyle:x.labelTextStyle];
        CGFloat location = i++;
        label.tickLocation = CPTDecimalFromCGFloat(location);
        label.offset = x.majorTickLength;
        if (label) {
            [xLabels addObject:label];
            [xLocations addObject:[NSNumber numberWithFloat:location]];
        }
    }
    x.axisLabels = xLabels;
    x.majorTickLocations = xLocations;

    // 4 - Configure y-axis
    CPTAxis *y = axisSet.yAxis;
    y.title = @"";
    y.titleTextStyle = axisTitleStyle;
    y.titleOffset = -40.0f;
    y.axisLineStyle = axisLineStyle;
    y.majorGridLineStyle = gridLineStyle;
    y.labelingPolicy = CPTAxisLabelingPolicyNone;
    y.labelTextStyle = axisTextStyle;
    y.labelOffset = 16.0f;
    y.majorTickLineStyle = axisLineStyle;
    y.majorTickLength = 4.0f;
    y.minorTickLength = 2.0f;
    y.tickDirection = CPTSignPositive;
    NSInteger majorIncrement = self.hrTick;
    NSInteger minorIncrement = self.hrHalfTick;
    CGFloat yMax = 700.0f;  // should determine dynamically based on max price
    NSMutableSet *yLabels = [NSMutableSet set];
    NSMutableSet *yMajorLocations = [NSMutableSet set];
    NSMutableSet *yMinorLocations = [NSMutableSet set];
    for (NSInteger j = minorIncrement; j <= yMax; j += minorIncrement) {
        NSUInteger mod = j % majorIncrement;
        if (mod == 0) {
            CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%li", (long)j] textStyle:y.labelTextStyle];
            NSDecimal location = CPTDecimalFromInteger(j);
            label.tickLocation = location;
            label.offset = -y.majorTickLength - y.labelOffset;
            if (label) {
                [yLabels addObject:label];
            }
            [yMajorLocations addObject:[NSDecimalNumber decimalNumberWithDecimal:location]];
        } else {
            [yMinorLocations addObject:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromInteger(j)]];
        }
    }
    y.axisLabels = yLabels;
    y.majorTickLocations = yMajorLocations;
    y.minorTickLocations = yMinorLocations;
}

#pragma mark - CPTPlotDataSource methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [self.dateArray count];
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {
    NSInteger valueCount = [self.dateArray count];
    switch (fieldEnum) {
        case CPTScatterPlotFieldX:
            if (index < valueCount) {
                return [NSNumber numberWithUnsignedInteger:index];
            }
            break;

        case CPTScatterPlotFieldY:

            if ([plot.identifier isEqual:hrSCORE] == YES) {
                NSLog(@"hrscore");
                return [self.hrArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:hrSCOREAVG] == YES) {
                NSLog(@"hravg");
                return [self.avgHrArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:fgSCORE] == YES) {
                NSLog(@"gfscore");

                return [self.fgArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:fgSCOREAVG] == YES) {
                NSLog(@"fgavg");

                return [self.avgFgArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:weightSCORE] == YES) {
                NSLog(@"weight");

                return [self.weightArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:weightSCOREAVG] == YES) {
                NSLog(@"weight av");

                return [self.avgWeightArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:mapSCORE] == YES) {
                NSLog(@"map");

                return [self.mapArray objectAtIndex:index];
            } else if ([plot.identifier isEqual:mapSCOREAVG] == YES) {
                NSLog(@"map avg");

                return [self.avgMapArray objectAtIndex:index];
            }

            break;
    }
    return [NSDecimalNumber zero];
}

1 个答案:

答案 0 :(得分:0)

刻度线位置和标签位于从零(0)开始的整数值上。你没有说xRange是什么,但是如果它的length小于一(1)并且它没有覆盖其中一个刻度位置,你将看不到任何刻度或标签