29716

Custom axis labels for Core Plot

I spent more than a week trying to have custom axis label for Core Plot, without success. I read many tutorials and examples on SO, and tried to replicate it in my project, but no success. Please help.

This is the code I have:

// Create an CPXYGraph and host it inside the view CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme]; CPTXYGraph *graph = (CPTXYGraph *)[theme newGraph]; hostView.hostedGraph = graph; graph.paddingTop = 10.0; graph.paddingLeft = 10.0; graph.paddingRight = 10.0; graph.paddingBottom = 10.0; [graph.plotAreaFrame setPaddingTop:10.0f]; [graph.plotAreaFrame setPaddingLeft:55.0f]; [graph.plotAreaFrame setPaddingRight:10.0f]; [graph.plotAreaFrame setPaddingBottom:35.0f]; // Set up Plot Space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; plotSpace.allowsUserInteraction = YES; plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(800) length:CPTDecimalFromInteger(400)]; plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(7000) length:CPTDecimalFromCGFloat(1000)]; // Set up Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; x.majorIntervalLength = CPTDecimalFromInteger(60); x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(7000); x.minorTicksPerInterval = 3; x.borderWidth = 0; x.majorTickLength = 5.0f; x.minorTickLength = 2.0f; x.axisLineCapMax = [CPTLineCap openArrowPlotLineCap]; x.axisLineCapMax.size = CGSizeMake(8, 10); x.labelingPolicy = CPTAxisLabelingPolicyAutomatic; NSMutableSet *xLabels = [NSMutableSet setWithCapacity:[self.arrXValues count]]; NSMutableSet *xLocations = [NSMutableSet setWithCapacity:[self.arrXValues count]]; CGFloat location = 0.0; for (NSString *string in self.arrXValues) { CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:string textStyle:x.labelTextStyle]; location++; label.tickLocation = CPTDecimalFromCGFloat(location); label.offset = x.titleOffset + x.majorTickLength; if (label) { [xLabels addObject:label]; [xLocations addObject:[NSNumber numberWithFloat:location]]; } } x.axisLabels = xLabels; x.majorTickLocations = xLocations; CPTXYAxis *y = axisSet.yAxis; y.majorIntervalLength = CPTDecimalFromCGFloat(250); y.minorTicksPerInterval = 5; y.orthogonalCoordinateDecimal = CPTDecimalFromInteger(800); y.majorTickLength = 5.0f; y.minorTickLength = 2.0f; y.axisLineCapMax = [CPTLineCap openArrowPlotLineCap]; y.axisLineCapMax.size = CGSizeMake(8, 10); // Set up the chart CPTScatterPlot *linePlot = [[CPTScatterPlot alloc] init]; linePlot.identifier = @"AAPL"; CPTMutableLineStyle *lineStyle = [linePlot.dataLineStyle mutableCopy]; lineStyle.lineWidth = 2.f; lineStyle.lineColor = [CPTColor blueColor]; linePlot.dataLineStyle = lineStyle; linePlot.dataSource = self; [graph addPlot:linePlot];

And this is my data structure:

self.arrXValues = [NSMutableArray arrayWithObjects:@"900", @"930", @"1000", @"1010", @"1020", @"1030", @"1040", @"1050", @"1100", @"1130", nil]; self.arrYValues = [NSMutableArray arrayWithObjects:@"7600", @"7460", @"7700", @"7720", @"7680", @"7700", @"7720", @"7720", @"7680", @"7700", nil];

If I turn labelingPolicy to CPTAxisLabelingPolicyAutomatic, it will show the default labels, but at least affirms that the labels are not hidden by something else. Unfortunately, I don't have enough reputations to post images.

Please help spot the mistake, there must something silly out there.

Answer1:

You're positioning the custom labels outside the visible plot range. The xRange covers values between 800 and 1,200 (length of 400). The labels are at 1, 2, 3, etc. Use the label value as the tickLocation:

label.tickLocation = CPTDecimalFromString(string); [xLocations addObject:string];

Recommend