I have a graph wtih scatter plot and barplot and I have two y axis. I wnt to be able to scroll horizontally without the y axes moves. When I have only one y axis my code works but when I add the second one. The second still moving up and down. Have you some idee?
Here is my code :
-(void) configureAxes:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme *)theme{
[super configureAxes:layerHostingView withTheme:theme];
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) layerHostingView.hostedGraph.axisSet;
CPTAxis *x = axisSet.xAxis;
CPTAxis *y = axisSet.yAxis;
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
x.labelingPolicy= CPTAxisLabelingPolicyNone;
NSMutableSet *xLabels = [NSMutableSet setWithCapacity:self.selectedExplYear.exploitation.count];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:self.selectedExplYear.exploitation.count];
for (int i = 0; i<self.selectedExplYear.exploitation.count; i++) {
SCExploitation *tech = self.selectedExplYear.exploitation[i];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMMM"];
NSDate *dateExploitation = [NSDate dateWithTimeIntervalSince1970:tech.exploitationDate.doubleValue/1000];
NSString *mois = [df stringFromDate:dateExploitation];
CPTAxisLabel *label = [[CPTAxisLabel alloc]initWithText:[NSString stringWithFormat:#"%#", mois] textStyle:x.labelTextStyle];
CGFloat location = i;
label.tickLocation = CPTDecimalFromCGFloat(location);
label.offset = x.majorTickLength;
if (label) {
[xLabels addObject:label];
[xLocations addObject:[NSNumber numberWithFloat:location]];
}
}
NSNumberFormatter *Xformatter = [[NSNumberFormatter alloc] init];
[Xformatter setGeneratesDecimalNumbers:NO];
[Xformatter setNumberStyle:NSNumberFormatterDecimalStyle];
y.labelFormatter = Xformatter;
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) layerHostingView.hostedGraph.defaultPlotSpace;
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = #"Helvetica-Bold";
axisTitleStyle.fontSize = 14.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = #"Helvetica-Bold";
axisTextStyle.fontSize = 14.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.0f;
tickLineStyle.lineColor = [CPTColor blackColor];
tickLineStyle.lineWidth = 1.0f;
x.axisLabels=xLabels;
x.majorTickLocations = xLocations;
axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:5];
y.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(250)];
CPTXYAxis *y2 = [[CPTXYAxis alloc] init];
y2.coordinate = CPTCoordinateY;
y2.plotSpace = self.scatterGraphPlotSpace;
y2.axisConstraints = [CPTConstraints constraintWithUpperOffset:0];
y2.labelingPolicy = CPTAxisLabelingPolicyFixedInterval;
y2.axisLineStyle = axisLineStyle;
y2.majorTickLineStyle = axisLineStyle;
y2.title = #"Km";
y2.majorIntervalLength = CPTDecimalFromFloat((80 - 0) / 5.0f);
y2.labelFormatter = Xformatter;
y2.titleTextStyle = axisTextStyle;
y2.labelTextStyle = axisTextStyle;
y2.tickDirection = CPTSignNone;
y2.tickLabelDirection = CPTSignPositive;
y2.orthogonalCoordinateDecimal = CPTDecimalFromFloat(5.0);
y2.titleOffset = 16.0 * CPTFloat(-2.1);
y2.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(80)];
self.scatterGraphPlotSpace.xRange = plotSpace.xRange;
layerHostingView.hostedGraph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil];
}
-(void)configurePlots:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme *)theme
{
CPTGraph *graph = layerHostingView.hostedGraph;
CPTBarPlot *barPlotTotalDetenteEau = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO];
barPlotTotalDetenteEau.identifier = DETENTEEAUIDENTIFIER;
CPTMutableLineStyle *lsEauPotable = [[CPTMutableLineStyle alloc]init];
lsEauPotable.lineColor = [CPTColor lightGrayColor];
lsEauPotable.lineWidth = 0.5;
barPlotTotalDetenteEau.lineStyle = lsEauPotable;
barPlotTotalDetenteEau.dataSource =self;
barPlotTotalDetenteEau.delegate = self;
barPlotTotalDetenteEau.zPosition = 90;
barPlotTotalDetenteEau.labelOffset = LABELOFFSET;
barPlotTotalDetenteEau.title = NSLocalizedString(#"exploitation_detente_eau", nil);
barPlotTotalDetenteEau.barWidth = CPTDecimalFromDouble(BARWIDTH);
barPlotTotalDetenteEau.barOffset = CPTDecimalFromDouble(0);
[graph addPlot:barPlotTotalDetenteEau toPlotSpace:graph.defaultPlotSpace];
CPTBarPlot *barPlotTotalControleGaz = [CPTBarPlot tubularBarPlotWithColor:[CPTColor yellowColor] horizontalBars:NO];
barPlotTotalControleGaz.identifier = CONTROLEGAZIDENTIFIER;
CPTMutableLineStyle *lsNouveau = [[CPTMutableLineStyle alloc]init];
lsNouveau.lineColor = [CPTColor lightGrayColor];
lsNouveau.lineWidth = 0.5;
barPlotTotalControleGaz.lineStyle = lsNouveau;
barPlotTotalControleGaz.dataSource =self;
barPlotTotalControleGaz.delegate = self;
barPlotTotalControleGaz.zPosition = 100;
barPlotTotalControleGaz.labelOffset = LABELOFFSET;
barPlotTotalControleGaz.title = NSLocalizedString(#"exploitation_controle_gaz", nil);
barPlotTotalControleGaz.barWidth = CPTDecimalFromDouble(BARWIDTH);
barPlotTotalControleGaz.barOffset = CPTDecimalFromDouble(BARWIDTH+0.01);
[graph addPlot:barPlotTotalControleGaz toPlotSpace:graph.defaultPlotSpace];
self.scatterGraphPlotSpace = [[CPTXYPlotSpace alloc] init];
self.scatterGraphPlotSpace.allowsUserInteraction =YES;
// self.scatterGraphPlotSpace.delegate =self;
CPTScatterPlot *controlerPlot = [[CPTScatterPlot alloc] init];
controlerPlot.dataSource = self;
controlerPlot.delegate = self;
controlerPlot.title = NSLocalizedString(#"km_fuite", nil);
controlerPlot.identifier = KMCONTROLERIDENTIFIER;
controlerPlot.plotSymbolMarginForHitDetection = 15.0f;
CPTColor *effectivePlotColor = [CPTColor redColor];
[graph addPlot:controlerPlot toPlotSpace:self.scatterGraphPlotSpace];
CPTBarPlot *barPlotTotalControleEau = [CPTBarPlot tubularBarPlotWithColor:[CPTColor greenColor] horizontalBars:NO];
barPlotTotalControleEau.identifier = CONTROLEEAUIDENTIFIER;
CPTMutableLineStyle *lsProvisoire = [[CPTMutableLineStyle alloc]init];
lsProvisoire.lineColor = [CPTColor lightGrayColor];
lsProvisoire.lineWidth = 0.5;
barPlotTotalControleEau.lineStyle = lsProvisoire;
barPlotTotalControleEau.dataSource = self;
barPlotTotalControleEau.delegate = self;
barPlotTotalControleEau.zPosition = 100;
barPlotTotalControleEau.labelOffset = LABELOFFSET;
barPlotTotalControleEau.title = NSLocalizedString(#"exploitation_controle_eau", nil);
barPlotTotalControleEau.barWidth = CPTDecimalFromDouble(BARWIDTH);
barPlotTotalControleEau.barOffset = CPTDecimalFromDouble(0);
[graph addPlot:barPlotTotalControleEau toPlotSpace:graph.defaultPlotSpace];
CPTBarPlot *barPlotTotalDetenteGaz = [CPTBarPlot tubularBarPlotWithColor:[CPTColor grayColor] horizontalBars:NO];
barPlotTotalDetenteGaz.identifier = DETENTEGAZIDENTIFIER;
CPTMutableLineStyle *lsAugmentation = [[CPTMutableLineStyle alloc]init];
lsAugmentation.lineColor = [CPTColor lightGrayColor];
lsAugmentation.lineWidth = 0.5;
barPlotTotalDetenteGaz.lineStyle = lsAugmentation;
barPlotTotalDetenteGaz.dataSource =self;
barPlotTotalDetenteGaz.delegate = self;
barPlotTotalDetenteGaz.zPosition = 70;
barPlotTotalDetenteGaz.labelOffset = LABELOFFSET;
barPlotTotalDetenteGaz.title = NSLocalizedString(#"exploitation_detente_gaz", nil);
barPlotTotalDetenteGaz.barWidth = CPTDecimalFromDouble(BARWIDTH);
barPlotTotalDetenteGaz.barOffset = CPTDecimalFromDouble(BARWIDTH+0.01);
[graph addPlot:barPlotTotalDetenteGaz toPlotSpace:graph.defaultPlotSpace];
NSArray *plots = #[barPlotTotalDetenteEau,barPlotTotalControleEau,barPlotTotalControleGaz,barPlotTotalDetenteGaz];
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
[plotSpace scaleToFitPlots:plots];
CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy];
[xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.3f)];
xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f) length:CPTDecimalFromFloat(4.0f)];
plotSpace.xRange = xRange;
CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy];
[yRange expandRangeByFactor:CPTDecimalFromCGFloat(1.4f)];
plotSpace.yRange = yRange;
plotSpace.delegate = self;
self.scatterGraphPlotSpace.globalYRange = plotSpace.globalYRange;
CPTScatterPlot *visuelPlot = [[CPTScatterPlot alloc] init];
visuelPlot.dataSource = self;
visuelPlot.delegate = self;
visuelPlot.title = NSLocalizedString(#"km_visuel", nil);
visuelPlot.identifier = KMVISUELIDENTIFIER;
visuelPlot.plotSymbolMarginForHitDetection = 15.0f;
CPTColor *budgeteePlotColor = [CPTColor orangeColor];
CPTMutableLineStyle *budgeteelLineStyle = [CPTMutableLineStyle lineStyle]; // [budgeteePlot.dataLineStyle mutableCopy];
budgeteelLineStyle.lineWidth = 2.5;
budgeteelLineStyle.lineColor = budgeteePlotColor;
visuelPlot.dataLineStyle = budgeteelLineStyle;
CPTPlotSymbol *budgeteeSymbol = [CPTPlotSymbol ellipsePlotSymbol];
budgeteeSymbol.fill = [CPTFill fillWithColor:budgeteePlotColor];
budgeteeSymbol.lineStyle = budgeteelLineStyle;
budgeteeSymbol.size = CGSizeMake(6.0f, 6.0f);
visuelPlot.plotSymbol = budgeteeSymbol;
CPTMutableLineStyle *effectiveLineStyle = [CPTMutableLineStyle lineStyle];
effectiveLineStyle.lineWidth = 2.5;
effectiveLineStyle.lineColor = effectivePlotColor;
controlerPlot.dataLineStyle = effectiveLineStyle;
CPTPlotSymbol *effectiveSymbol = [CPTPlotSymbol ellipsePlotSymbol];
effectiveSymbol.fill = [CPTFill fillWithColor:effectivePlotColor];
effectiveSymbol.lineStyle = effectiveLineStyle;
effectiveSymbol.size = CGSizeMake(6.0f, 6.0f);
controlerPlot.plotSymbol = effectiveSymbol;
[self.scatterGraphPlotSpace scaleToFitPlots:[NSArray arrayWithObjects:controlerPlot, visuelPlot, nil]];
[graph addPlot:visuelPlot toPlotSpace:self.scatterGraphPlotSpace];
CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(250)];
plotSpace.globalYRange = globalYRange;
self.scatterGraphPlotSpace.yRange =[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(80)];
CPTMutablePlotRange *y2Range = [self.scatterGraphPlotSpace.yRange mutableCopy];
[y2Range expandRangeByFactor:CPTDecimalFromCGFloat(1.4f)];
self.scatterGraphPlotSpace.yRange = y2Range;
[layerHostingView.hostedGraph addPlotSpace:self.scatterGraphPlotSpace];
}
-(void)configureGraph:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme *)theme
{
CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:layerHostingView.bounds];
graph.plotAreaFrame.masksToBorder = NO;
layerHostingView.hostedGraph = graph;
if(self.selectedExplYear.exploitation.count> 3){
graph.defaultPlotSpace.allowsUserInteraction = YES;
}
[graph applyTheme:self.theme];
graph.paddingBottom = 60.0f;
graph.paddingLeft = 30.0f;
graph.paddingTop = 30.0f;
graph.paddingRight = 30.0f;
graph.title = nil;
}
-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement
{
return CGPointMake(displacement.x, 0);
}
-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate
{
if (space == self.scatterGraphPlotSpace) {
if (coordinate == CPTCoordinateY) {
newRange = self.scatterGraphPlotSpace.yRange;
}
}else{
if (coordinate == CPTCoordinateY) {
newRange = ((CPTXYPlotSpace*)space).yRange;
}
}
return newRange;
}
Thanks a lot
Set the delegate for self.scatterGraphPlotSpace. That line of code is commented out in the code you posted.
Related
I have integrated Core Plot in my iOS App.I have few issues as mentioned below:
1) Need to show yellow line and red line behind y-axis.
2) Need to have the y-range as 5,10,15 only.Link For Graph Image
Below is my code:
-(void)configureHost {
self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:CGRectMake(60, 80, 400, 200)];
}
-(void)configureGraph {
CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:CGRectMake(10, 100, 300, 200)];
self.hostView.hostedGraph = graph;
graph.plotAreaFrame.borderLineStyle = nil;
graph.plotAreaFrame.cornerRadius = 10.0f ;
graph.paddingLeft = 0.0;
graph.paddingRight = 0.0;
graph.paddingTop = 0.0;
graph.paddingBottom = 0.0;
[graph.plotAreaFrame setPaddingLeft:30.0f];
[graph.plotAreaFrame setPaddingRight:20.0f];
[graph.plotAreaFrame setPaddingTop:20.0f];
[graph.plotAreaFrame setPaddingBottom:40.0f];
}
-(void)configurePlots {
CPTGraph *lGraph = self.hostView.hostedGraph;
CPTXYPlotSpace *lPlotSpace = (CPTXYPlotSpace *) lGraph.defaultPlotSpace;
CPTScatterPlot *lDataLinePlot = [[CPTScatterPlot alloc] init];
lDataLinePlot.dataSource = self;
lDataLinePlot.identifier = CPDTickerSymbolBLUELINE;
lDataLinePlot.interpolation = CPTScatterPlotInterpolationCurved;
CPTColor *lDataLineColor = [CPTColor blueColor];
[lGraph addPlot:lDataLinePlot toPlotSpace:lPlotSpace];
[lGraph.defaultPlotSpace scaleToFitPlots:[lGraph allPlots]];
CPTScatterPlot *lDangerLinePlot = [[CPTScatterPlot alloc] init];
lDangerLinePlot.dataSource = self;
lDangerLinePlot.identifier = CPDTickerSymbolDANGERREDLINE;
lDangerLinePlot.interpolation = CPTScatterPlotInterpolationCurved;
CPTColor *lDangerLineColor = [CPTColor redColor];
[lGraph addPlot:lDangerLinePlot toPlotSpace:lPlotSpace];
CPTScatterPlot *lYellowLinePlot = [[CPTScatterPlot alloc] init];
lYellowLinePlot.dataSource = self;
lYellowLinePlot.identifier = CPDTickerSymbolYELLOWLINE;
lYellowLinePlot.interpolation = CPTScatterPlotInterpolationCurved;
CPTColor *lYellowLineColor = [CPTColor yellowColor];
[lGraph addPlot:lYellowLinePlot toPlotSpace:lPlotSpace];
[lPlotSpace scaleToFitPlots:[NSArray arrayWithObjects:lYellowLinePlot,lDangerLinePlot,lDataLinePlot, nil]];
min=0;
lPlotSpace.yRange = [CPTPlotRange
plotRangeWithLocation:CPTDecimalFromCGFloat(min)
length:CPTDecimalFromCGFloat((15))];
CPTMutablePlotRange *lRangeX = [lPlotSpace.xRange mutableCopy];
[lRangeX expandRangeByFactor:CPTDecimalFromCGFloat(1.005f)];
lPlotSpace.xRange = lRangeX;
CPTMutablePlotRange *lRangeY = [lPlotSpace.yRange mutableCopy];
[lRangeY expandRangeByFactor:CPTDecimalFromCGFloat(1.0f)];
lPlotSpace.yRange = lRangeY;
CPTColor *lAreaColor = [CPTColor colorWithComponentRed:255.0 green:255.0 blue:255.0 alpha:1.0];
CPTGradient *lAreaGradient =[CPTGradient gradientWithBeginningColor:lAreaColor endingColor:[CPTColor clearColor]];
lAreaGradient. angle = 90.0f ;
CPTMutableLineStyle *lDataLineStyle = [lDataLinePlot.dataLineStyle mutableCopy];
lDataLineStyle.lineWidth = 3;
lDataLineStyle.lineColor = lDataLineColor;
lDataLinePlot.dataLineStyle = lDataLineStyle;
CPTMutableLineStyle *lYellowLineStyle = [lDataLinePlot.dataLineStyle mutableCopy];
lYellowLineStyle.lineWidth = 1.5;
lYellowLineStyle.lineColor = lYellowLineColor;
lYellowLinePlot.dataLineStyle = lYellowLineStyle;
CPTMutableLineStyle *lDataLineStyleSymbol = [CPTMutableLineStyle lineStyle];
lDataLineStyleSymbol.lineColor = lDataLineColor;
CPTMutableLineStyle *lYellowLineStyleSymbol = [CPTMutableLineStyle lineStyle];
lYellowLineStyleSymbol.lineColor = lYellowLineColor;
CPTMutableLineStyle *lDangerLineStyle = [lDangerLinePlot.dataLineStyle mutableCopy];
lDangerLineStyle.lineWidth = 1.5;
lDangerLineStyle.lineColor = lDangerLineColor;
lDangerLinePlot.dataLineStyle = lDangerLineStyle;
CPTMutableLineStyle *lDangerLineStyleSumbol = [CPTMutableLineStyle lineStyle];
lDangerLineStyleSumbol.lineColor = lDangerLineColor;
CPTMutableLineStyle *lDataSymbolLineStyle = [CPTMutableLineStyle lineStyle];
lDataSymbolLineStyle.lineColor = lDataLineColor;
CPTMutableLineStyle *lYellowSymbolLineStyle = [CPTMutableLineStyle lineStyle];
lYellowSymbolLineStyle.lineColor = lYellowLineColor;
}
-(void)configureAxes {
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor blackColor];
axisTitleStyle.fontName = #"Helvetica";
axisTitleStyle.fontSize = 13.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 3.0f;
axisLineStyle.lineColor = [CPTColor blackColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor blackColor];
axisTextStyle.fontName = #"Bold";
axisTextStyle.fontSize = 8.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor blackColor];
tickLineStyle.lineWidth = 1.0f;
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;
/////X-AXIS DATE
DateArray=[[NSMutableArray alloc]init];
NSDateFormatter *format=[[NSDateFormatter alloc]init];
format.dateFormat=#"MM/dd/yy";
NSCalendar *calendar1 = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *components1 = [calendar1 components:NSCalendarUnitYear
| NSCalendarUnitMonth | NSCalendarUnitDay
fromDate:[NSDate date]];
for (int i = 0; i < 60; ++i)
{
NSDate *date1 = [calendar1 dateFromComponents:components1];
NSString *getDate1=[format stringFromDate:date1];
NSString *lReplaced = [getDate1 substringToIndex:5];
lReplaced = [lReplaced stringByReplacingOccurrencesOfString:#"-"
withString:#"/"];
NSString *match = #"/";
NSMutableString *preTel;
NSString *postTel;
NSScanner *scanner = [NSScanner scannerWithString:lReplaced];
[scanner scanUpToString:match intoString:&preTel];
[scanner scanString:match intoString:nil];
postTel = [lReplaced substringFromIndex:scanner.scanLocation];
NSString *newStr1;
NSString *newStr2;
if ([preTel intValue] <10) {
newStr1 = [preTel substringFromIndex:1];
}else{
newStr1=preTel;
}
if ([postTel intValue] <10) {
newStr2 = [postTel substringFromIndex:1];
}else{
newStr2=postTel;
}
lReplaced =[NSString stringWithFormat:#"%#%#%#",newStr1,match,newStr2];
[DateArray addObject:lReplaced];
++components1.day;
}
NSOrderedSet *mySet = [[NSOrderedSet alloc] initWithArray:DateArray];
DateArray = [[NSMutableArray alloc] initWithArray:[mySet array]];
//////// configure x-Axes
CPTAxis *x = axisSet.xAxis;
x.titleTextStyle = axisTitleStyle;
x.axisLineStyle = axisLineStyle;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
x.labelTextStyle = axisTextStyle;
x.majorTickLineStyle = axisLineStyle;
x.tickDirection = CPTSignPositive;
CGFloat dateCount = [dayArray count];
NSMutableSet *xLabels = [NSMutableSet setWithCapacity:dateCount];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:dateCount];
int lIndex = 1;
for (int i=0;i< [DateArray count];i++)
{
// NSLog(#"i VAL:%d",i);
NSString *date = [DateArray objectAtIndex:i];
// NSLog(#"date:%#",date);
CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:date textStyle:x.labelTextStyle];
CGFloat location = i*3.40;
//NSLog(#"LOC:%f",location);
label.tickLocation = CPTDecimalFromCGFloat(location);
label.offset = -20.0f;
[xLabels addObject:label];
[xLocations addObject:[NSNumber numberWithFloat:location]];
lIndex++;
i = i+6;
}
x.axisLabels = xLabels;
x.majorTickLocations = xLocations;
//////// Configure Y-Axes
CPTAxis *y = axisSet.yAxis;
y.title = #"Hb";
y.titleTextStyle = axisTitleStyle;
y.titleOffset = -30.0f;
y.axisLineStyle = axisLineStyle;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
// y.preferredNumberOfMajorTicks=5;
y.labelTextStyle = axisTextStyle;
y.labelOffset = -35.0f;
y.majorTickLineStyle = axisLineStyle;
y.tickDirection = CPTSignPositive;
NSInteger majorIncrement = 5;
NSInteger minorIncrement = 5;
CGFloat yMax =15.0f;
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 = -20.0f;//-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;
}
Use the topDownLayerOrder to move the axis line in front of the plots.
CPTPlotArea *plotArea = graph.plotAreaFrame.plotArea;
plotArea.topDownLayerOrder = #[#(CPTGraphLayerTypeAxisLines)];
Set the yRange to start at 5.0 with length 10.0:
lPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0)
length:CPTDecimalFromDouble(10.0)];
In my app I am using core plot. Everything is fine as below
.
On pressing next or prev button, core plot shows values of next or previous 7 days. When I press the button many times say 142 times, graph disappears and core plot only shows x and y labels as shown below..
And on tapping more app crashes. How can I fix my issue? Please help. Also in the debug area it shows
malloc: * mach_vm_map(size=8388608) failed (error code=3)
* error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug
It also gives bad access at
I don't know where my issue is.My code for generating graph is...
- (void)generateLayout
{
//Create graph from theme
self.graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero];
CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
self.graph = (CPTXYGraph *)[theme newGraph];
//graph.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
self.graph.plotAreaFrame.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:183.0/255.0 green:206.0/255.0 blue:227.0/255.0 alpha:1.0]];
//[graph applyTheme:[CPTTheme themeNamed:kCPTDarkGradientTheme]];
self.hostedGraph = self.graph;
self.graph.plotAreaFrame.masksToBorder = NO;
self.graph.paddingLeft = 0.0f;
self.graph.paddingTop = 0.0f;
self.graph.paddingRight = 0.0f;
self.graph.paddingBottom = 0.0f;
CPTMutableLineStyle *borderLineStyle = [CPTMutableLineStyle lineStyle];
borderLineStyle.lineColor = [CPTColor clearColor];
borderLineStyle.lineWidth = 2.0f;
self.graph.plotAreaFrame.borderLineStyle = borderLineStyle;
self.graph.plotAreaFrame.paddingTop = 10.0;
self.graph.plotAreaFrame.paddingRight = 10.0;
self.graph.plotAreaFrame.paddingBottom = 30.0;
self.graph.plotAreaFrame.paddingLeft = 50.0;
//Add plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace;
plotSpace.delegate = self;
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Here We Can Set The Range Of Y Axis////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0) length:CPTDecimalFromInt(greaterGlass * sets.count)];
//plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(greaterGlass * sets.count)];
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(-1)
length:CPTDecimalFromInt(8)];
//Grid line styles
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle];
majorGridLineStyle.lineWidth = 2.75;
majorGridLineStyle.lineColor = [[CPTColor colorWithComponentRed:113.0/255.0 green:91.0/255.0 blue:84.0/255.0 alpha:1.0] colorWithAlphaComponent:1.0];
CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.50;
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1];
majorGridLineStyle.dashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInteger:1], [NSNumber numberWithInteger:5], nil];
//Axes
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet;
//X axis
CPTXYAxis *x = axisSet.xAxis;
x.orthogonalCoordinateDecimal = CPTDecimalFromInt(0);
x.majorIntervalLength = CPTDecimalFromInt(1);
x.minorTicksPerInterval = 0;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
x.majorGridLineStyle = majorGridLineStyle;
x.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
//X labels
int labelLocations = 0;
//NSMutableArray *customXLabels = [NSMutableArray array];
NSMutableArray *customXLabels = [NSMutableArray arrayWithCapacity:[dates count]];
//for (NSString *day in dates)
for(int couter=0; couter<[dates count]; couter++)
{
NSString *day = [NSString stringWithFormat:#"%#",[dates objectAtIndex:couter]];
CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:day textStyle:x.labelTextStyle];
newLabel.tickLocation = [[NSNumber numberWithInt:labelLocations] decimalValue];
newLabel.offset = x.labelOffset + x.majorTickLength;
//newLabel.rotation = M_PI / 4;
[customXLabels addObject:newLabel];
labelLocations++;
[newLabel release];
}
x.axisLabels = [NSSet setWithArray:customXLabels];
//Y axis
CPTXYAxis *y = axisSet.yAxis;
CGRect frame = CGRectMake(0, 0, 50, 30);
UILabel *label = [[UILabel alloc] initWithFrame:frame] ;
label.font = [UIFont fontWithName:#"ComicSansMS-Bold" size:12.0];
label.textAlignment = NSTextAlignmentCenter;
label.text = #"Number of Glasses";
y.title = label.text;
y.titleOffset = 50.0f;
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
y.majorGridLineStyle = majorGridLineStyle;
y.minorGridLineStyle = minorGridLineStyle;
y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
//Create a bar line style
CPTMutableLineStyle *barLineStyle = [[[CPTMutableLineStyle alloc] init] autorelease];
barLineStyle.lineWidth = 1.0;
barLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *whiteTextStyle = [CPTMutableTextStyle textStyle];
whiteTextStyle.color = [CPTColor whiteColor];
//Plot
BOOL firstPlot = YES;
for (NSString *set in [[sets allKeys] sortedArrayUsingSelector:#selector(localizedCaseInsensitiveCompare:)]) {
//UIColor *myColor = [UIColor colorWithRed:87.0/255.0 green:181.0/255.0 blue:229.0/255.0 alpha:1.0];
//CPTColor *mineColor = [CPTColor colorWithComponentRed:160 green:97 blue:5 alpha:1];
CPTBarPlot *plot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO];
plot.lineStyle = barLineStyle;
CGColorRef color = ((UIColor *)[sets objectForKey:set]).CGColor;
//plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:color]];
plot.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:111.0/255.0 green:164.0/255.0 blue:205.0/255.0 alpha:1.0]];
if (firstPlot) {
plot.barBasesVary = NO;
firstPlot = NO;
} else {
plot.barBasesVary = YES;
}
plot.barWidth = CPTDecimalFromFloat(0.5f);
plot.barsAreHorizontal = NO;
plot.dataSource = self;
plot.identifier = set;
[self.graph addPlot:plot toPlotSpace:plotSpace];
}
}
We have implemented 2Y scattred chart using Core-Plot - the output is has one chart plotted with X and Y axis and then some white space on top and then X and Y2 axis chart is drawn.
We want the chart to have X and y axis and the X and Y2 axis chart to be overlapped so that user can view it properly.
sample code is here:
-(void)configureGraph {
graph = [[CPTXYGraph alloc] initWithFrame:CGRectMake(0, 0, self.hostView.bounds.size.width, self.hostView.bounds.size.height)];
[graph applyTheme:[CPTTheme themeNamed:kCPTPlainWhiteTheme]];
self.hostView.hostedGraph = graph;
[graph setPaddingTop:5.0f];
[graph setPaddingLeft:5.0f];
[graph setPaddingRight:5.0f];
[graph setPaddingBottom:5.0f];
[graph.plotAreaFrame setPaddingTop:5.0f];
[graph.plotAreaFrame setPaddingRight:20.0f];
[graph.plotAreaFrame setPaddingLeft:20.0f];
[graph.plotAreaFrame setPaddingBottom:25.0f];
graph.plotAreaFrame.borderLineStyle = nil;
}
-(void)configurePlots {
CPTColor *your_color = [CPTColor colorWithComponentRed:126 green:230 blue:255 alpha:0];
int cntSelectedVar = 0;
graph = self.hostView.hostedGraph;
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
CPTXYPlotSpace *plotSpace2 = (CPTXYPlotSpace *) graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = NO;
plotSpace2.allowsUserInteraction = NO;
//
// 1 - Get graph and plot space
graph.plotAreaFrame.fill = [CPTFill fillWithColor:your_color];
// 2 - Create the three plots
CPTScatterPlot *aaplPlot = [[CPTScatterPlot alloc] init];
aaplPlot.dataSource = self;
aaplPlot.identifier = variableID ;
CPTColor *aaplColor = [self GetRGBForPlotSymbol:cntSelectedVar];
[graph addPlot:aaplPlot toPlotSpace:plotSpace];
CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy];
plotSpace.xRange = xRange;
CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy];
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;
cntSelectedVar++;
CPTScatterPlot *googPlot= [[CPTScatterPlot alloc] init];
googPlot.dataSource = self;
googPlot.identifier = variableID;
[self.hostView.hostedGraph addPlot:googPlot];
CPTColor *googColor = [self GetRGBForPlotSymbol:cntSelectedVar];
plotSpace2.xRange = plotSpace.xRange;
CPTMutablePlotRange *y2Range = [[CPTMutablePlotRange alloc] initWithLocation:CPTDecimalFromDouble(FinalMinValueY2) length:CPTDecimalFromDouble(FinalMaxValueY2)];
plotSpace2.yRange = y2Range ;
CPTMutableLineStyle *googLineStyle = [googPlot.dataLineStyle mutableCopy];
googLineStyle.lineWidth = 0;
googLineStyle.lineColor = googColor;
googPlot.dataLineStyle = googLineStyle;
CPTMutableLineStyle *googSymbolLineStyle = [CPTMutableLineStyle lineStyle];
googSymbolLineStyle.lineColor = googColor;
CPTPlotSymbol *googSymbol = [CPTPlotSymbol ellipsePlotSymbol];
googSymbol.fill = [CPTFill fillWithColor:googColor];
googSymbol.lineStyle = googSymbolLineStyle;
googSymbol.size = CGSizeMake(3.0f, 3.0f);
googPlot.plotSymbol = googSymbol;
[graph addPlot:googPlot toPlotSpace:plotSpace2];
cntSelectedVar++;
[plotSpace scaleToFitPlots:[graph allPlots]];
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;
// 2 - Get axis set
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) (id)self.hostView.hostedGraph.axisSet;
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(OrignalMinValueY);
CPTXYAxis *x = axisSet.xAxis;
CPTXYAxis *y = axisSet.yAxis;
x.titleTextStyle = axisTitleStyle;
x.titleOffset = 12.0f;
x.axisLineStyle = axisLineStyle;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
x.labelTextStyle = axisTextStyle;
x.majorTickLineStyle = axisLineStyle;
x.tickDirection = CPTSignNegative;
x.minorTickLineStyle = nil;
x.coordinate = CPTCoordinateX;
CGFloat dateCount = [Reportdates count];
NSMutableSet *xLabels = [NSMutableSet setWithCapacity:dateCount];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:dateCount];
// CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:st textStyle:x.labelTextStyle];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSMutableSet *xMajorLocations = [NSMutableSet set];
[formatter setPositiveFormat:#"0.##" ];
for (double j = FinalMinValueX; j <= FinalMaxValueX; j += FinalIntervalValueX) {
CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[formatter stringFromNumber:[ NSNumber numberWithDouble:j ] ] textStyle:x.labelTextStyle];
NSDecimal location = CPTDecimalFromInteger(j);
label.tickLocation = location;
label.offset = x.labelOffset;
if (label) {
[xLabels addObject:label];
}
[xMajorLocations addObject:[NSDecimalNumber decimalNumberWithDecimal:location]];
}
x.axisLabels = xLabels;
x.majorTickLocations = xLocations;
// 4 - Configure y-axis
//y.title = #"Price";
y.titleTextStyle = axisTitleStyle;
y.titleOffset = -40.0f;
y.axisLineStyle = axisLineStyle;
y.majorGridLineStyle = gridLineStyle;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelTextStyle = axisTextStyle;
y.majorTickLineStyle = axisLineStyle;
y.tickDirection = CPTSignPositive;
y.separateLayers= YES;
double majorIncrement = FinalIntervalValueY;
double minorIncrement = FinalIntervalValueY;
CGFloat yMax = FinalMaxValueY; // should determine dynamically based on max price
NSMutableSet *yLabels = [NSMutableSet set];
NSMutableSet *yMajorLocations = [NSMutableSet set];
NSMutableSet *yMinorLocations = [NSMutableSet set];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setPositiveFormat:#"0.##" ];
for (double j = FinalMinValueY; j <= yMax; j += minorIncrement) {
CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[formatter stringFromNumber:[ NSNumber numberWithDouble:j ] ] textStyle:y.labelTextStyle];
NSDecimal location = CPTDecimalFromInteger(j);
label.tickLocation = location;
label.offset = -20;
if (label) {
[yLabels addObject:label];
}
[yMajorLocations addObject:[NSDecimalNumber decimalNumberWithDecimal:location]];
}
y.axisLabels = yLabels;
y.majorTickLocations = yMajorLocations;
y.minorTickLocations = yMinorLocations;
if( [ApplicationSettingOBJ.GB_VariableArrayY2 count ]>0)
{
CPTXYAxis *y2 = [[CPTXYAxis alloc] init] ;
y2.titleTextStyle = axisTitleStyle;
y2.coordinate = CPTCoordinateY;
y2.plotSpace = plotSpace2;
y2.labelingPolicy = CPTAxisLabelingPolicyNone;
y2.separateLayers= NO;
y2.majorGridLineStyle = nil;
y2.labelTextStyle = axisTextStyle;
y2.majorTickLineStyle = axisLineStyle;
y2.tickDirection = CPTSignNone;
y2.orthogonalCoordinateDecimal =CPTDecimalFromFloat(dateCount);
majorIncrement = FinalIntervalValueY2;
minorIncrement = FinalIntervalValueY2;
yMax = FinalMaxValueY2; // should determine dynamically based on max price
NSMutableSet *yLabels1 = [NSMutableSet set];
NSMutableSet *yMajorLocations1 = [NSMutableSet set];
NSMutableSet *yMinorLocations1 = [NSMutableSet set];
for (double j = FinalMinValueY2; j <= yMax; j += minorIncrement) {
CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[formatter stringFromNumber:[ NSNumber numberWithDouble:j ] ] textStyle:y2.labelTextStyle];
NSDecimal location = CPTDecimalFromInteger(j);
label.tickLocation = location;
label.offset = -20;
if (label) {
[yLabels1 addObject:label];
}
[yMajorLocations1 addObject:[NSDecimalNumber decimalNumberWithDecimal:location]];
}
y2.axisLabels = yLabels1;
y2.majorTickLocations = yMajorLocations1;
y2.minorTickLocations = yMinorLocations1;
axisSet.axes = [NSArray arrayWithObjects:x, y,y2, nil];
}
plotSpace and plotSpace2 are the same object (graph.defaultPlotSpace). If you want two different y scales, create a new plot space and add it to the graph.
CPTXYPlotSpace *plotSpace2 = [[CPTXYPlotSpace alloc] init];
[graph addPlotSpace:plotSpace2];
I created a core plot graph, have one x-axis, two y-axis, now, I want to have two lines and first use the first y-axis, second use the second y-axis, but it doesn't work. Who can guide me?
- (void)viewDidLoad
{
[super viewDidLoad];
graph = [[CPTXYGraph alloc] initWithFrame:CGRectMake(10, 100, 300, 300)];
// graph.backgroundColor = [CPTColor clearColor].cgColor;
CPTTheme * theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
[graph applyTheme:theme];
CPTGraphHostingView * hostingView = [[CPTGraphHostingView alloc] initWithFrame:CGRectMake(10, 100, 300, 300)];
hostingView.hostedGraph = graph;
[self.view addSubview:hostingView];
[hostingView release];
graph.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
// Plot area
// graph.plotAreaFrame.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
graph.plotAreaFrame.paddingTop = 10;
graph.plotAreaFrame.paddingBottom = 50;
graph.plotAreaFrame.paddingLeft = 20.0;
graph.plotAreaFrame.paddingRight = 20.0;
graph.plotAreaFrame.cornerRadius = 10.0;
graph.plotAreaFrame.masksToBorder = NO;
// graph.plotAreaFrame.axisSet.borderLineStyle = [CPTLineStyle lineStyle];
graph.plotAreaFrame.plotArea.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
// Setup plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1) length:CPTDecimalFromDouble(7)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(53.0) length:CPTDecimalFromDouble(4)];
// Line styles
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 3.0;
axisLineStyle.lineCap = kCGLineCapRound;
// Label x axis with a fixed interval policy
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
x.separateLayers = YES;//
x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(53);
x.majorIntervalLength = CPTDecimalFromDouble(1);
x.minorTicksPerInterval = 1;
x.tickDirection = CPTSignNegative;
x.axisLineStyle = axisLineStyle;
x.majorTickLength = 2.0;
x.majorTickLineStyle = axisLineStyle;
// Label y with an automatic labeling policy.
axisLineStyle.lineColor = [CPTColor greenColor];
CPTXYAxis *y = axisSet.yAxis;
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
y.separateLayers = YES;//
y.minorTicksPerInterval = 0;
y.tickDirection = CPTSignNegative;
y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0);
y.axisLineStyle = axisLineStyle;
y.majorTickLength = 6.0;
y.majorTickLineStyle = axisLineStyle;
// Label y2 with an equal division labeling policy.
axisLineStyle.lineColor = [CPTColor orangeColor];
CPTXYPlotSpace * plotSpace2 = [[CPTXYPlotSpace alloc] init];
plotSpace2.xRange = plotSpace.xRange;
plotSpace2.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1) length:CPTDecimalFromFloat(5)];
[graph addPlotSpace:plotSpace2];
CPTXYAxis *y2 = [[[CPTXYAxis alloc] init] autorelease];
y2.coordinate = CPTCoordinateY;
y2.plotSpace = plotSpace2;
y2.orthogonalCoordinateDecimal = CPTDecimalFromDouble(8.0);
y2.labelingPolicy = CPTAxisLabelingPolicyAutomatic;//
y2.separateLayers = NO;
y2.preferredNumberOfMajorTicks = 0;
y2.minorTicksPerInterval = 0;
y2.tickDirection = CPTSignPositive;
y2.axisLineStyle = axisLineStyle;
y2.majorTickLength = 6.0;
y2.majorTickLineStyle = axisLineStyle;
y2.minorTickLength = 4.0;
y2.titleOffset = 30.0;
//
CPTMutableLineStyle * lineStyle1 = [[CPTMutableLineStyle lineStyle] retain];
lineStyle1.lineWidth = 3.0f;
lineStyle1.lineColor = [CPTColor blueColor];
dataSourceLinePlot1 = [[CPTScatterPlot alloc] init];
dataSourceLinePlot1.identifier = #"1plot";
CPTPlotSymbol *plotSymbol1 = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol1.size = CGSizeMake(10, 10);
plotSymbol1.fill = [CPTFill fillWithColor:[CPTColor redColor]];
plotSymbol1.lineStyle = lineStyle1;
CPTMutableShadow *shadow1 = [CPTMutableShadow shadow];
shadow1.shadowColor = [CPTColor blueColor];
shadow1.shadowBlurRadius = 10.0;
dataSourceLinePlot1.shadow = shadow1;
dataSourceLinePlot1.plotSymbol = plotSymbol1;
dataSourceLinePlot1.dataLineStyle = lineStyle1;
dataSourceLinePlot1.dataSource = self;
[graph addPlot:dataSourceLinePlot1];
//-----------------------------------
CPTMutableLineStyle * lineStyle2 = [[CPTMutableLineStyle lineStyle] retain];
lineStyle2.lineWidth = 3.0f;
lineStyle2.lineColor = [CPTColor greenColor];
dataSourceLinePlot2 = [[CPTScatterPlot alloc] init];
dataSourceLinePlot2.identifier = #"2plot";
CPTPlotSymbol * plotSymbol2 = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol2.size = CGSizeMake(10, 10);
plotSymbol2.fill = [CPTFill fillWithColor:[CPTColor redColor]];
plotSymbol2.lineStyle = lineStyle2;
CPTMutableShadow *shadow2 = [CPTMutableShadow shadow];
shadow2.shadowColor = [CPTColor greenColor];
shadow2.shadowBlurRadius = 10.0;
dataSourceLinePlot2.shadow = shadow2;
dataSourceLinePlot2.plotSymbol = plotSymbol2;
dataSourceLinePlot2.dataLineStyle = lineStyle2;
dataSourceLinePlot2.dataSource = self;
[graph addPlot:dataSourceLinePlot2];
// Add the y2 axis to the axis set
graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil];
dataArray1 = [[NSMutableArray alloc] init];
dataArray2 = [[NSMutableArray alloc] init];
for(int i=0; i< 7; i++){
float a = (float)(random()%40 + 530) / 10;
[dataArray1 addObject:[NSNumber numberWithFloat:a]];
}
for (int i = 0; i < 7; i++) {
// float a = (float)(random()%40 + 530) / 10;
[dataArray2 addObject:[NSNumber numberWithFloat:4]];
}
NSLog(#"array1 = %#,array2 = %#",dataArray1,dataArray2);
}
there is my delegate:
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
NSLog(#"%d",[dataArray1 count]);
if ([[plot identifier] isEqual:#"1plot"]) {
return [dataArray1 count];
}
return [dataArray2 count];
}
- (NSNumber *) numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {
if(fieldEnum == CPTScatterPlotFieldY){
if ([[plot identifier] isEqual:#"1plot"]) {
return [dataArray1 objectAtIndex:index];
}else{
return [dataArray2 objectAtIndex:index];
}
}else{
return [NSNumber numberWithFloat:index];
}
}
You are setting the datasource delegate to self before the arrays have any data put into them. You need to either initialize the array earlier or call [graph reloadData];
Does anybody have an idea about placing the values of the coordinates of the graph diagonally?
EDIT: I succeeded displaying the values of the oX-axis diagonally. Maybe it can help someone:
label.rotation = M_PI/4;
The other question would be if somebody can give me some links or tutorials on how to make a description appear near the point of the scatter plot, that I click on.
This is my code for the scatter plots, that I draw on the graph:
-(void)initPlot {
[self configureHost];
[self configureGraph];
[self configurePlots];
[self configureAxes];
}
-(void)configureHost {
self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:CGRectMake(0, 40 , 480, 280)];
self.hostView.allowPinchScaling = YES;
[self.view addSubview:self.hostView];
}
-(void)configureGraph {
graph = [[CPTXYGraph alloc] initWithFrame:self.hostView.bounds];
[graph applyTheme:[CPTTheme themeNamed:kCPTDarkGradientTheme]];
self.hostView.hostedGraph = graph;
// 2 - Set graph title
NSString *title = #"Valori";
graph.title = title;
// 3 - Create and set text style
CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle];
titleStyle.color = [CPTColor whiteColor];
titleStyle.fontName = #"Helvetica-Bold";
titleStyle.fontSize = 16.0f;
graph.titleTextStyle = titleStyle;
graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
graph.titleDisplacement = CGPointMake(0.0f, 10.0f);
// 4 - Set padding for plot area
[graph.plotAreaFrame setPaddingLeft:30.0f];
[graph.plotAreaFrame setPaddingBottom:30.0f];
// 5 - Enable user interactions for plot space
plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
}
-(void)configurePlots {
// 1 - Get graph and plot space
graph = self.hostView.hostedGraph;
plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
// 2 - Create the three plots
aaplPlot = [[CPTScatterPlot alloc] init];
aaplPlot.dataSource = self;
aaplPlot.identifier = CPDTickerSymbolAAPL;
CPTColor *aaplColor = [CPTColor redColor];
[graph addPlot:aaplPlot toPlotSpace:plotSpace];
msftPlot = [[CPTScatterPlot alloc] init];
msftPlot.dataSource = self;
msftPlot.identifier = CPDTickerSymbolMSFT;
CPTColor *msftColor = [CPTColor clearColor];
[graph addPlot:msftPlot toPlotSpace:plotSpace];
// 3 - Set up plot space
NSArray *array = [[NSArray alloc] initWithObjects:aaplPlot, msftPlot, nil];
[plotSpace scaleToFitPlots:array];
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 = 2.5;
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(6.0f, 6.0f);
aaplPlot.plotSymbol = aaplSymbol;
CPTMutableLineStyle *msftLineStyle = [msftPlot.dataLineStyle mutableCopy];
msftLineStyle.lineWidth = 2.0;
msftLineStyle.lineColor = msftColor;
msftPlot.dataLineStyle = msftLineStyle;
CPTMutableLineStyle *msftSymbolLineStyle = [CPTMutableLineStyle lineStyle];
msftSymbolLineStyle.lineColor = msftColor;
CPTPlotSymbol *msftSymbol = [CPTPlotSymbol diamondPlotSymbol];
msftSymbol.fill = [CPTFill fillWithColor:msftColor];
msftSymbol.lineStyle = msftSymbolLineStyle;
msftSymbol.size = CGSizeMake(6.0f, 6.0f);
msftPlot.plotSymbol = msftSymbol;
}
-(void)configureAxes {
// 1 - Create styles
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = #"Helvetica-Bold";
axisTitleStyle.fontSize = 12.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = #"Helvetica-Bold";
axisTextStyle.fontSize = 11.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.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 = #"Ziua Lunii";
x.titleTextStyle = axisTitleStyle;
x.titleOffset = 15.0f;
x.axisLineStyle = axisLineStyle;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
x.labelTextStyle = axisTextStyle;
x.majorTickLineStyle = axisLineStyle;
x.majorTickLength = 4.0f;
x.tickDirection = CPTSignNegative;
CGFloat dateCount = [[[CPDStockPriceStore sharedInstance] datesInMonth] count];
NSMutableSet *xLabels = [NSMutableSet setWithCapacity:dateCount];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:dateCount];
NSInteger i = 0;
for (NSString *date in [[CPDStockPriceStore sharedInstance] datesInMonth]) {
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 = #"Pret";
y.titleTextStyle = axisTitleStyle;
y.titleOffset = -50.0f;
y.axisLineStyle = axisLineStyle;
y.majorGridLineStyle = gridLineStyle;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelTextStyle = axisTextStyle;
y.labelOffset = 23.0f;
y.majorTickLineStyle = axisLineStyle;
y.majorTickLength = 4.0f;
y.minorTickLength = 2.0f;
y.tickDirection = CPTSignPositive;
NSInteger majorIncrement = 100;
NSInteger minorIncrement = 50;
CGFloat yMax = 1300.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:#"%i", 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;
}
You can use -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index for this purpose, as demonstrated in the examples of Core Plot