Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Two y axis in core plot graph with different axis scales

I am programming a app where I have graph with two y axis and one x axis.left y axis has range from 0 to 20 so there are 20 majorTick axis.Right y axis has range from 0 to 10,so I want left y axis to be labelled for every alternate majorTickAxis.

here is my code snippet

//code
   CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace;
float xmax=10.0;
float xmin=0.0;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xmin)      length:CPTDecimalFromFloat(xmax-xmin)];
float ymax=20.0;
float ymin=0.0;
float ymax2=10.0;
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(ymin) length:CPTDecimalFromFloat(ymax-ymin)];



// Grid line styles
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle];
majorGridLineStyle.lineWidth = 0.75;
majorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.75];

CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.25;
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1];

CPTMutableLineStyle *redLineStyle = [CPTMutableLineStyle lineStyle];
redLineStyle.lineWidth = 2.0;
redLineStyle.lineColor = [[CPTColor redColor] colorWithAlphaComponent:0.5];                         

CPTMutableLineStyle *greenLineStyle = [CPTMutableLineStyle lineStyle];
greenLineStyle.lineWidth = 2.0;
greenLineStyle.lineColor = [[CPTColor greenColor] colorWithAlphaComponent:0.5];     

// Axes
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet;
CPTXYAxis *x          = axisSet.xAxis;
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
x.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue];
x.minorTicksPerInterval       = 4;
x.labelOffset = 3.0f;
x.title         = @"Time";
x.titleOffset   = 20.0;
x.titleLocation = CPTDecimalFromFloat((xmax+xmin)/2);
x.majorGridLineStyle= majorGridLineStyle;
x.minorGridLineStyle=minorGridLineStyle;


CPTXYAxis *y = axisSet.yAxis;
y.majorIntervalLength         = CPTDecimalFromString(@"1.0");
y.majorTickLength=2.0f;
y.minorTicksPerInterval       = 4;
y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0.0);
y.labelExclusionRanges = [NSArray arrayWithObjects:
                          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0.0) 
                                                       length:CPTDecimalFromInteger(0.0)],Nil];
y.majorGridLineStyle= majorGridLineStyle;
y.minorGridLineStyle=minorGridLineStyle;


CPTXYAxis *y2 = [[(CPTXYAxis *)[CPTXYAxis alloc] initWithFrame:CGRectZero] autorelease];
y2.plotSpace    =plotSpace;     
y2.orthogonalCoordinateDecimal = CPTDecimalFromFloat(xmax);
y2.majorGridLineStyle=majorGridLineStyle;
y2.minorGridLineStyle=minorGridLineStyle;
y2.minorTicksPerInterval       = 4;
y2.majorIntervalLength        = CPTDecimalFromString(@"1.0");
y2.labelOffset        = 10.0;
y2.coordinate          =CPTCoordinateY;

y2.axisLineStyle       = x.axisLineStyle;
y2.labelTextStyle              = x.labelTextStyle;
y2.labelOffset                 = -30.0f;
y2.visibleRange                = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(ymax2)];


y2.title                       = @"Temperature";
y2.titleLocation               = CPTDecimalFromInteger(5.0);
y2.titleTextStyle              =x.titleTextStyle;
y2.titleOffset                 =-45.0f;
y2.labelExclusionRanges = [NSArray arrayWithObjects:
                          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0.0) 
                                                       length:CPTDecimalFromInteger(0.0)],Nil];


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

// Create a plot that uses the data source method for red graph
CPTScatterPlot *redPlot = [[[CPTScatterPlot alloc] init] autorelease];
redPlot.identifier = @"red Plot";;

CPTMutableLineStyle *lineStyle = [[redPlot.dataLineStyle mutableCopy] autorelease];
lineStyle.miterLimit        = 1.0f;
redPlot.dataLineStyle = redLineStyle;
redPlot.dataSource = self;
redPlot.interpolation = CPTScatterPlotInterpolationStepped;

[self.graph addPlot:redPlot];

// Create a plot that uses the data source method for green graph
CPTScatterPlot *greenPlot = [[[CPTScatterPlot alloc] init] autorelease];
greenPlot.identifier = @"green Plot";;

CPTMutableLineStyle *greenlineStyle = [[greenPlot.dataLineStyle mutableCopy] autorelease];
greenlineStyle.miterLimit       = 1.0f;
greenPlot.dataLineStyle = greenLineStyle;
greenPlot.dataSource = self;
[self.graph addPlot:greenPlot];

 // Add some data
NSMutableArray *newData = [NSMutableArray arrayWithCapacity:100];
NSUInteger i;
for ( i = 0; i < 45; i++ ) {
    id x = [NSNumber numberWithDouble:i * 0.2];
    id y = [NSNumber numberWithDouble:i * rand() / ((double)RAND_MAX*5.0) ];        
    [newData addObject:[NSDictionary dictionaryWithObjectsAndKeys:
      x, @"x",y, @"y",nil]];
}
NSMutableArray *newData1 = [NSMutableArray arrayWithCapacity:100];
for ( i = 0; i < 45; i++ ) {
    id x =[NSNumber numberWithDouble:i * rand() / ((double)RAND_MAX*5.0) ]; 
    id y2 = [NSNumber numberWithDouble:i * 0.2];
    [newData1 addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                        x, @"x",y2, @"y2",nil]];
}
self.plotData = newData;
self.plotData2=newData1;
like image 386
raja Avatar asked Jun 07 '12 10:06

raja


People also ask

Can you have two different scales on the y-axis?

You can use a second Y axis with a different scale than the primary Y axis to plot a series of data on a different scale. This lets you compare two dissimilar series of data on the same chart without overemphasizing the importance of the larger series.

Can two different scales can be used for the same axis in a graph?

Each of the scales can be shared by more than one measure. For example, in the bar chart below, two columns share the scale to the left. To the right, another scale is used for the third column, because the unit is different and the values are of totally different magnitudes.

Can you graph data with two y-axis?

You can use the Double Y-axis Graphs to plot two different data series. You can achieve this using a secondary y-axis on the right hand side.


1 Answers

If you want the two y-axes to have different scales, you need to add another plot space. Use the same xRange for the second plot space, but use a different yRange, e.g.,

CPTXYPlotSpace *plotSpace2 = [[[CPTXYPlotSpace alloc] init] autorelease];
plotSpace2.xRange = plotSpace.xRange;
plotSpace2.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(ymin)
                                                 length:CPTDecimalFromFloat(ymax2 - ymin)];
[graph addPlotSpace:plotSpace2];
y2.plotSpace = plotSpace2;

Use the majorIntervalLength to control the location of the ticks and grid lines:

y.majorIntervalLength = CPTDecimalFromFloat((ymax - ymin) / 10.0f);
y2.majorIntervalLength = CPTDecimalFromFloat((ymax2 - ymin) / 10.0f);
like image 176
Eric Skroch Avatar answered Jan 26 '23 17:01

Eric Skroch