2012-06-07 11 views
8

Estoy programando una aplicación donde tengo un gráfico con dos ejes yy un eje x.left tiene un rango de 0 a 20, por lo que hay 20 ejes más grandes. Derecha y el eje tiene un rango de 0 a 10, por lo que quiero que el eje y izquierdo se etiquete para cada TickAxis principal alternativo.Dos ejes y en el gráfico del diagrama de núcleo con diferentes escalas de ejes

aquí es mi fragmento de código

//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

Ajuste el 'labelExclusionRanges' a 'nil' si no lo necesitas. –

Respuesta

10

si desea que los dos ejes y que tengan diferentes escalas, es necesario agregar otro espacio trama. Utilice el mismo xRange para el segundo espacio de trama, pero el uso de un diferente yRange, por ejemplo,

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; 

Utilice la majorIntervalLength para controlar la ubicación de las garrapatas y las líneas de la cuadrícula:

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

Hola Eric, muchas gracias, tu código fue muy útil, ahora tengo diferentes escalas para ambos eje Y – raja

+0

en caso de que use barras para mostrar mis valores y tengo dos ejes y con dos espacios de trazado (donde uno es rojo y está verde, por ejemplo) y usan el mismo eje x, que los representará uno sobre el otro, por lo que mi barra roja que representa el primer valor se cubrirá con verde representando el 2º valor en la misma posición del eje x. De hecho, me gustaría que esas barras rojas y verdes se centren un poco en el valor del eje x para que ambas sean visibles. ¿Es eso posible? – Ewoks

+0

Puede usar la propiedad 'barOffset' para mover las barras en una o ambas parcelas lejos de la línea central normal para que pueda ver ambas. –

Cuestiones relacionadas