Frage

I have multiple y axis in my chart and I want to show the different charting scales for each y axis. My chart is showing 2 y axis on it, but the second y axis is not showing the scale over it.

I have added two different plot spaces of each axis. It is plotting data, but not showing the scale for the second y axis.

//plot configuration
-(void)configurePlots {
CPTColor *your_color = [CPTColor colorWithComponentRed:126 green:230 blue:255 alpha:0];


    // 1 - Get graph and plot space
    CPTGraph *graph = self.hostView.hostedGraph;
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
    CPTXYPlotSpace *plotSpace2 =[[CPTXYPlotSpace alloc] init];
    graph.plotAreaFrame.fill = [CPTFill fillWithColor:your_color];
    // 2 - Create the three plots
    CPTScatterPlot *aaplPlot = [[CPTScatterPlot alloc] init];
    aaplPlot.dataSource = self;
    aaplPlot.identifier = CPDTickerSymbolAAPL;
    CPTColor *aaplColor = [CPTColor redColor];
    [graph addPlot:aaplPlot toPlotSpace:plotSpace];

    [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:aaplPlot, 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 *aaplLineStyle = [aaplPlot.dataLineStyle mutableCopy];
    aaplLineStyle.lineWidth = 0;
    aaplLineStyle.lineColor = aaplColor;
    aaplPlot.dataLineStyle = aaplLineStyle;
    CPTMutableLineStyle *aaplSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    aaplSymbolLineStyle.lineColor = aaplColor;
    CPTPlotSymbol *aaplSymbol = [CPTPlotSymbol ellipsePlotSymbol];
    aaplSymbol.fill = [CPTFill fillWithColor:aaplColor];
    aaplSymbol.lineStyle = aaplSymbolLineStyle;
    aaplSymbol.size = CGSizeMake(3.0f, 3.0f);
    aaplPlot.plotSymbol = aaplSymbol;

    CPTScatterPlot *googPlot = [[CPTScatterPlot alloc] init];
    googPlot.dataSource = self;
    googPlot.identifier = CPDTickerSymbolGOOG;
    CPTColor *googColor = [CPTColor greenColor];
    [graph addPlotSpace:plotSpace2];
    [graph addPlot:googPlot toPlotSpace:plotSpace2];


    [plotSpace2 scaleToFitPlots:[NSArray arrayWithObjects:googPlot, nil]];

    [xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.1f)];
    plotSpace2.xRange = plotSpace.xRange;
    CPTMutablePlotRange *y2Range = [plotSpace2.yRange mutableCopy];
    [yRange expandRangeByFactor:CPTDecimalFromCGFloat(1.2f)];
    plotSpace2.yRange = y2Range;

    CPTMutableLineStyle *googLineStyle = [googPlot.dataLineStyle mutableCopy];
    googLineStyle.lineWidth = 0;
    googLineStyle.lineColor = googColor;
    googPlot.dataLineStyle = googLineStyle;
    googPlot.plotSpace = plotSpace2;
    CPTMutableLineStyle *googSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    googSymbolLineStyle.lineColor = googColor;
    CPTPlotSymbol *googSymbol = [CPTPlotSymbol diamondPlotSymbol];
    googSymbol.fill = [CPTFill fillWithColor:googColor];
    googSymbol.lineStyle = googSymbolLineStyle;
    googSymbol.size = CGSizeMake(2.0f, 2.0f);
    googPlot.plotSymbol = googSymbol;



    CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
    axisTitleStyle.color = [CPTColor blackColor];
    axisTitleStyle.fontName = @"Helvetica";
    axisTitleStyle.fontSize = 10.0f;
    CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle ];
    axisLineStyle.lineWidth = 1.0f;
    axisLineStyle.lineColor = [CPTColor blackColor];
    CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
    axisTextStyle.color = [CPTColor blackColor];
    axisTextStyle.fontName = @"Helvetica";
    axisTextStyle.fontSize = 8.0f;
    CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
    tickLineStyle.lineColor = [CPTColor blackColor];
    tickLineStyle.lineWidth = 1.0f;
    CPTMutableLineStyle *gridLineStyle = [CPTMutableLineStyle lineStyle];
    gridLineStyle.lineColor = [CPTColor grayColor];
    gridLineStyle.lineWidth = 1.0f;


    tickLineStyle.lineColor = [CPTColor blackColor];
    tickLineStyle.lineWidth = 1.0f;

    CPTXYAxisSet *axisSet = (CPTXYAxisSet *) (id)self.hostView.hostedGraph.axisSet;
    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(FinalMinValueY);




    CPTXYAxis *x = axisSet.xAxis;
    CPTXYAxis *y = axisSet.yAxis;
    CPTXYAxis *y2 = [(CPTXYAxis *)[CPTXYAxis alloc] init] ;



    //x.title = @"Day of Month";
    x.titleTextStyle = axisTitleStyle;

    x.titleOffset = 4.0f;
    x.axisLineStyle = axisLineStyle;
    //x.labelingPolicy = CPTAxisLabelingPolicyNone;
    x.labelTextStyle = axisTextStyle;
    x.majorTickLineStyle = axisLineStyle;
    x.majorTickLength = 2.0f;
    x.tickDirection = CPTSignNegative;
    x.minorTickLineStyle = nil;

    CGFloat dateCount = [Reportdates count];
    NSMutableSet *xLabels = [NSMutableSet setWithCapacity:dateCount];
    NSMutableSet *xLocations = [NSMutableSet setWithCapacity:dateCount];
    NSMutableSet *xMinorLocations = [NSMutableSet setWithCapacity:dateCount];
    NSInteger i = 0;
    NSInteger intervalValue = 0;
    NSArray *ArrDatesForMajorTicks =[self CalculateXasisInterval];
    for (NSString *date in Reportdates) {

        NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init];
        [DateFormatter setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
        NSDate *d = [DateFormatter dateFromString:date];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"MM/dd/yy"];
        NSString *st = [dateFormat stringFromDate:d];
        // NSLog(@"%@",st);

        CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:st  textStyle:x.labelTextStyle];
        //label.rotation = M_PI/4;
        CGFloat location = i;

        label.tickLocation = CPTDecimalFromCGFloat(location);
        label.offset = x.majorTickLength;
        if(i==0 || i==intervalValue)
        {
            if (label) {
                [xLabels addObject:label];
                [xLocations addObject:[NSNumber numberWithFloat:location]];
            }
            intervalValue = intervalValue + FinalIntervalValueX;
        }
        else
        {

            [xMinorLocations addObject:[NSNumber numberWithFloat:location]];

        }
        i++;
    }

    x.axisLabels = xLabels;
    x.majorTickLocations = xLocations;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    // x.minorTickLocations =xMinorLocations;
    // 4 - Configure y-axis

    //y.title = @"Price";
    y.titleTextStyle = axisTitleStyle;
    y.titleOffset = -40.0f;
    y.axisLineStyle = axisLineStyle;
    y.majorGridLineStyle = gridLineStyle;
    //y.alternatingBandFills = [NSArray arrayWithObjects:[CPTColor redColor], [CPTColor greenColor], nil];
    y.labelingPolicy = CPTAxisLabelingPolicyNone;
    y.labelTextStyle = axisTextStyle;
    y.labelOffset = 12.0f;
    y.majorTickLineStyle = axisLineStyle;
    y.majorTickLength = 1.0f;
    y.minorTickLength = 1.0f;
    y.tickDirection = CPTSignPositive;
    //x.preferredNumberOfMajorTicks = 6;

    NSInteger majorIncrement = FinalIntervalValueY;
    NSInteger minorIncrement = FinalIntervalValueY;
    CGFloat yMax = FinalMaxValueY;  // should determine dynamically based on max price
    NSMutableSet *yLabels = [NSMutableSet set];
    NSMutableSet *yMajorLocations = [NSMutableSet set];
    NSMutableSet *yMinorLocations = [NSMutableSet set];
    for (NSInteger j = FinalMinValueY; j <= yMax; j += minorIncrement) {
        NSUInteger mod =  j % majorIncrement;
        if (mod == 0) {
            CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%i", j] textStyle:y.labelTextStyle];
            NSDecimal location = CPTDecimalFromInteger(j);
            label.tickLocation = location;
            //label.offset = -y.majorTickLength - y.labelOffset;
            label.offset = -20;
            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;




    //y2 axis implementation.



    //y2.title = @"Price";
    y2.titleTextStyle = axisTitleStyle;
//    y2.titleOffset = -40.0f;
    CPTMutableTextStyle *axisTextStyleY2 = [[CPTMutableTextStyle alloc] init];
    axisTextStyleY2.color = [CPTColor redColor];
    axisTextStyleY2.fontName = @"Helvetica";
    axisTextStyleY2.fontSize = 18.0f;

    y2.axisLineStyle = axisLineStyle;
    y2.majorGridLineStyle = Nil;
    //y.alternatingBandFills = [NSArray arrayWithObjects:[CPTColor redColor], [CPTColor greenColor], nil];
    y2.labelingPolicy = CPTAxisLabelingPolicyNone;
    y2.labelTextStyle = axisTextStyleY2;
    y2.labelOffset = 12.0f;
    y2.majorTickLineStyle = axisLineStyle;
    y2.majorTickLength = 1.0f;
    y2.minorTickLength = 1.0f;
    y2.tickDirection = CPTSignPositive;
    y2.axisConstraints =  [CPTConstraints constraintWithUpperOffset:0];
    y2.labelingPolicy = CPTAxisLabelingPolicyNone;
    y2.minorTicksPerInterval = 0;

    y2.coordinate = CPTCoordinateY;
    y2.plotSpace = plotSpace2;

    majorIncrement = FinalIntervalValueY;
    minorIncrement = FinalIntervalValueY;
    yMax = FinalMaxValueY;  // should determine dynamically based on max price
    NSMutableSet *yLabels1 = [NSMutableSet set];
    NSMutableSet *yMajorLocations1 = [NSMutableSet set];
    NSMutableSet *yMinorLocations1 = [NSMutableSet set];
    for (NSInteger j = FinalMinValueY; j <= yMax; j += minorIncrement) {
        NSUInteger mod =  j % majorIncrement;
        if (mod == 0) {
            CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%i", j] textStyle:y2.labelTextStyle];
            NSDecimal location = CPTDecimalFromInteger(j);
            label.tickLocation = location;
            //label.offset = -y.majorTickLength - y.labelOffset;
            label.offset = -20;
            if (label) {
                [yLabels1 addObject:label];
            }
            [yMajorLocations1 addObject:[NSDecimalNumber decimalNumberWithDecimal:location]];
        } else {
            [yMinorLocations1 addObject:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromInteger(j)]];
        }
    }

    y2.axisLabels = yLabels;
    y2.majorTickLocations = yMajorLocations1;
    y2.minorTickLocations = yMinorLocations1;



    x.coordinate =  CPTCoordinateX;
    y.coordinate =  CPTCoordinateY;
    y2.coordinate = CPTCoordinateY;

    axisSet.axes = [NSArray arrayWithObjects:x, y,y2, nil];

}

-(void)configureAxes {
    // 1 - Create styles

}


//data binding.
#pragma mark - Rotation
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

#pragma mark - CPTPlotDataSource methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    //  return [[[CPDStockPriceStore sharedInstance] datesInMonth] count];
    return [Reportdates count];
}

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

        case CPTScatterPlotFieldY:
            if ([plot.identifier isEqual:CPDTickerSymbolAAPL] == YES) {
                //              return [[[CPDStockPriceStore sharedInstance] monthlyPrices:CPDTickerSymbolAAPL] objectAtIndex:index];
                return [ChartValues objectAtIndex:index];
            } else if ([plot.identifier isEqual:CPDTickerSymbolGOOG] == YES) {
                //              return [[[CPDStockPriceStore sharedInstance] monthlyPrices:CPDTickerSymbolGOOG] objectAtIndex:index];
                return [ChartValues objectAtIndex:index];
            } else if ([plot.identifier isEqual:CPDTickerSymbolMSFT] == YES) {
                return [[[CPDStockPriceStore sharedInstance] monthlyPrices:CPDTickerSymbolMSFT] objectAtIndex:index];
            }
            break;
    }
    return [NSDecimalNumber zero];
}
War es hilfreich?

Lösung

The tick marks are only 1 pixel long (y2.majorTickLength = 1.0f;) which is the same as the width of the axis line. Since they use the same style, they are invisible when drawn on top of the axis line. Make the ticks longer or a different color so you can see them.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top