2012-06-07 6 views
8

Sto programmando un'app in cui ho un grafico con due assi y un asse x asse.left ha intervallo da 0 a 20 quindi ci sono 20 assi principali. l'asse ha un range compreso tra 0 e 10, quindi voglio che l'asse y sinistro sia etichettato per ogni MajorTickAxis alternativo.Due assi nel grafico di core grafico con scale degli assi differenti

qui è il mio frammento di codice

//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; 
+0

Impostare il 'labelExclusionRanges' a 'nil' se non ne hai bisogno. –

risposta

10

Se si desidera che i due assi Y di avere diverse scale, è necessario aggiungere un altro spazio trama. Utilizzare lo stesso xRange per il secondo spazio trama, ma utilizzare un diverso yRange, ad esempio,

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; 

Utilizzare la majorIntervalLength per controllare la posizione dei zecche e linee della griglia:

y.majorIntervalLength = CPTDecimalFromFloat((ymax - ymin)/10.0f); 
y2.majorIntervalLength = CPTDecimalFromFloat((ymax2 - ymin)/10.0f); 
+0

ciao Eric, grazie mille, il tuo codice è stato molto utile, ora ho scale diverse per entrambi l'asse y – raja

+0

nel caso io usi le barre per visualizzare i miei valori e ho due assi y con due spazi di trama (dove uno è rosso ed è verde per esempio) e usano lo stesso asse x, che li renderà uno sopra l'altro così ad esempio la mia barra rossa che rappresenta il primo valore sarà coperta con il verde che rappresenta il 2 ° valore nella stessa posizione dell'asse x. Mi piacerebbe davvero che quelle barre rosse e verdi siano un po 'centrate attorno al valore dell'asse x in modo che siano entrambe visibili. È possibile? – Ewoks

+0

È possibile utilizzare la proprietà 'barOffset' per spostare le barre in uno o entrambi i diagrammi lontano dalla normale linea centrale in modo da poterle vedere entrambe. –