2012-03-21 32 views
7

Tôi đã triển khai biểu đồ CorePlot trong ứng dụng iOS của mình, tuy nhiên tôi không thể tự động định kích thước trục y dựa trên các điểm dữ liệu trong tập hợp. Một số bộ dữ liệu nằm trong khoảng từ 10-50, trong khi các bộ dữ liệu khác có phạm vi từ 400-500. Trong cả hai trường hợp, tôi muốn có xuất xứ y (0) hiển thị.CorePlot - Đặt phạm vi trục y để bao gồm tất cả các điểm dữ liệu

Tôi đã thử bằng cách sử dụng phương pháp scaletofitplots:

[graph.defaultPlotSpace scaleToFitPlots:[graph allPlots]]; 

nhưng điều này không ảnh hưởng đến các đồ thị, họ vẫn hiển thị mặc định phạm vi Y-Axis từ 0 đến 1.

Cách duy nhất mà Tôi có thể thay đổi trục y là thực hiện theo cách thủ công thông qua điều này:

graph.defaultPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)) length:CPTDecimalFromFloat(500.0f)]; 

tuy nhiên điều này không hoạt động tốt cho đồ thị có phạm vi nhỏ hơn (10-50), như bạn có thể tưởng tượng.

Có phương pháp nào để lấy giá trị y cao nhất từ ​​tập dữ liệu của tôi để tôi có thể đặt trục y tối đa thành giá trị đó theo cách thủ công không? Hoặc là có một lựa chọn tốt hơn?

EDIT: Dưới đây là các tập tin Tôi đang sử dụng:

#import "TUTSimpleScatterPlot.h" 

@implementation TUTSimpleScatterPlot 

@synthesize hostingView = _hostingView; 
@synthesize graph = _graph; 
@synthesize graphData = _graphData; 

-(id)initWithHostingView:(CPTGraphHostingView *)hostingView andData:(NSMutableArray *)data { 
    self = [super init]; 

    if (self != nil) { 
     self.hostingView = hostingView; 
     self.graphData = data; 
     self.graph = nil; 
    } 
    return self; 
} 

-(void)initialisePlot { 

    if ((self.hostingView == nil) || (self.graphData == nil)) { 
     NSLog(@"TUTSimpleScatterPlot: Cannot Initialise plot with hosting view and data"); 
     return; 
    } 

    if (self.graph != nil) { 
     NSLog(@"TUTSimpleScatterPlot: Graph Object already exists."); 
    } 
    NSDate *refDate = [NSDate date]; 
    NSTimeInterval oneDay = 24 * 60 * 60; 

    CGRect frame = [self.hostingView bounds]; 
    self.graph = [[CPTXYGraph alloc] initWithFrame:frame]; 

    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 
    plotSpace.allowsUserInteraction = YES; 
    plotSpace.delegate = self; 
    self.graph.plotAreaFrame.paddingBottom = 20.0f; 
    self.graph.plotAreaFrame.paddingLeft = 35.0f; 


    self.hostingView.hostedGraph = self.graph; 

    CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
    lineStyle.lineColor = [CPTColor whiteColor]; 
    lineStyle.lineWidth = 2.0f; 

    CPTMutableLineStyle *lineStyleThin = [CPTMutableLineStyle lineStyle]; 
    lineStyleThin.lineColor = [CPTColor whiteColor]; 
    lineStyleThin.lineWidth = 1.0f; 

    CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; 
    textStyle.fontName = @"HelveticaNeue-Medium"; 
    textStyle.fontSize = 10; 
    textStyle.color = [CPTColor whiteColor]; 

    CPTMutableLineStyle *plotSymbolLineStyle = [CPTMutableLineStyle lineStyle]; 
    plotSymbolLineStyle.lineColor = [CPTColor whiteColor]; 
    plotSymbolLineStyle.lineWidth = 1.0f; 

    CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
    plotSymbol.lineStyle = plotSymbolLineStyle; 
    plotSymbol.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:0.4 green:0.6 blue:0.8 alpha:1.0]]; 
    plotSymbol.size = CGSizeMake(8.0, 8.0); 

    CPTScatterPlot *plot = [[CPTScatterPlot alloc] init]; 
    plot.dataSource = self; 
    plot.identifier = @"mainPlot"; 

    [plotSpace scaleToFitPlots:[graph allPlots]]; 

    CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy]; 
    [yRange expandRangeByFactor:CPTDecimalFromDouble(615)]; 
    plotSpace.yRange = yRange; 

    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(oneDay - (oneDay * 6.3f)) length:CPTDecimalFromFloat(oneDay * 6.6f)]; 
    plotSpace.allowsUserInteraction = YES; 

    CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0f) length:CPTDecimalFromDouble(615.0f)]; 
    plotSpace.globalYRange = globalYRange; 

    // Modify the graph's axis with a label, line style, etc 
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet; 

    axisSet.xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; 
    axisSet.xAxis.axisLineStyle = lineStyle; 
    axisSet.xAxis.majorTickLineStyle = lineStyle; 
    axisSet.xAxis.labelTextStyle = textStyle; 
    axisSet.xAxis.labelOffset = 1.0f; 
    axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay*1); 
    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0.0"); 
    axisSet.xAxis.minorTicksPerInterval = 0; 
    axisSet.xAxis.majorTickLength = 0.0f; 
    axisSet.xAxis.majorGridLineStyle = majorGridLineStyle; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"dd MMM"]; 
    CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter]; 
    timeFormatter.referenceDate = refDate; 
    axisSet.xAxis.labelFormatter = timeFormatter; 

    axisSet.yAxis.axisLineStyle = lineStyle; 
    axisSet.yAxis.majorTickLineStyle = lineStyle; 
    axisSet.yAxis.minorTickLineStyle = lineStyleThin; 
    axisSet.yAxis.labelTextStyle = textStyle; 
    axisSet.yAxis.labelOffset = 3.0f; 
    axisSet.yAxis.majorIntervalLength = CPTDecimalFromString(@"50.0"); 
    axisSet.yAxis.minorTicksPerInterval = 1; 
    axisSet.yAxis.minorTickLength = 3.0; 
    axisSet.yAxis.majorTickLength = 5.0; 
    axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0); 
    axisSet.yAxis.majorGridLineStyle = majorGridLineStyle; 

    axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; 

    CPTMutableLineStyle *theLineStyle = [CPTMutableLineStyle lineStyle]; 
    theLineStyle.lineColor = [CPTColor colorWithComponentRed:0.3 green:0.6 blue:0.9 alpha:1.0]; 
    theLineStyle.lineWidth = 2.0f; 

    plot.dataLineStyle = theLineStyle; 
    plot.plotSymbol = plotSymbol; 

    [self.graph addPlot:plot]; 

} 

Trả lời

8

Dường như bạn đang sử dụng một cách chính xác -scaleToFitPlots:. Phương pháp này sẽ cập nhật dữ liệu lô nếu cần. Đảm bảo dữ liệu thích hợp có sẵn cho nguồn dữ liệu trước khi bạn gọi.

Sửa dựa trên mã mới:

-scaleToFitPlots: đang được gọi trước khi bạn thêm âm mưu đồ thị. Do đó mảng -allPlots trống và không có gì để mở rộng. Di chuyển hoạt động mở rộng quy mô sau khi cốt truyện được xây dựng và thêm vào biểu đồ.

+0

Tôi đã dán toàn bộ tệp trong câu hỏi của mình ngay bây giờ. Có lẽ điều đó sẽ giúp xem liệu tôi có đang triển khai '-scaleToFitPlots:' đúng không. – zdestiny

+0

Tôi đã di chuyển 'scaleToFitPlots' đến cuối, ngay bên dưới' [self.graph addPlot: plot] 'và nó hoạt động ngay bây giờ. Cảm ơn bạn đã giúp đỡ. – zdestiny

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