2012-06-07 34 views
8

Tôi đang lập trình ứng dụng mà tôi có đồ thị với hai trục y và một trục x trục.left y có phạm vi từ 0 đến 20 vì vậy có 20 trục chính. trục có phạm vi từ 0 đến 10, vì vậy tôi muốn trục y bên trái được gắn nhãn cho mọi phương thức thay thế lớnTickAxis.Hai trục y trong biểu đồ cốt lõi có các trục khác nhau

đây là mã của tôi đoạn mã

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

Đặt 'labelExclusionRanges' để 'nil' nếu bạn không cần nó. –

Trả lời

10

Nếu bạn muốn hai y trục có quy mô khác nhau, bạn cần phải thêm một không gian âm mưu. Sử dụng cùng một xRange cho không gian âm mưu thứ hai, nhưng sử dụng một khác nhau yRange, ví dụ:

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; 

sử dụng majorIntervalLength để kiểm soát vị trí của bọ ve và đường lưới:

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

hi Eric, Cảm ơn rất nhiều, mã của bạn đã rất hữu ích, Bây giờ tôi có quy mô khác nhau cho cả hai trục y – raja

+0

trong trường hợp tôi sử dụng thanh để hiển thị giá trị của tôi và tôi có hai trục y với hai không gian âm mưu (trong đó một là màu đỏ và màu xanh lá cây chẳng hạn) và chúng sử dụng cùng trục x, chúng sẽ hiển thị chúng trên nhau, ví dụ thanh màu đỏ của tôi biểu diễn giá trị đầu tiên sẽ được che bằng màu xanh lá cây biểu thị giá trị thứ 2 ở cùng vị trí trục x. Tôi thực sự muốn những thanh màu đỏ và màu xanh lá cây đó được định tâm xoay quanh giá trị trục x để chúng có thể nhìn thấy được. Điều đó có thể không? – Ewoks

+0

Bạn có thể sử dụng thuộc tính 'barOffset' để di chuyển các thanh trong một hoặc cả hai ô ra khỏi đường trung tâm thông thường để bạn có thể nhìn thấy cả hai. –

Các vấn đề liên quan