2012-03-21 13 views
7

मैंने अपने आईओएस एप्लिकेशन में कोरप्लॉट ग्राफ लागू किया है, हालांकि मैं सेट में डेटा पॉइंट्स के आधार पर वाई-एक्सिस को गतिशील रूप से आकार देने में असमर्थ हूं। कुछ डेटासेट 10-50 से हैं, जबकि अन्य 400-500 से लेकर होंगे। दोनों मामलों में, मैं वाई-मूल (0) दृश्यमान होना चाहता हूं।कोरप्लॉट - वाई-एक्सिस रेंज सेट करने के लिए सभी डेटा पॉइंट्स

मैं scaletofitplots विधि का उपयोग कर की कोशिश की है:

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

लेकिन इस रेखांकन पर कोई प्रभाव नहीं, वे अभी भी 0 1.

एक ही रास्ता के डिफ़ॉल्ट Y- अक्ष रेंज बताते हैं कि मैं बदल सकते हैं y- अक्ष इस के माध्यम से मैन्युअल यह करने के लिए है:

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

लेकिन इस, छोटी सीमाओं (10-50) के साथ रेखांकन के लिए अच्छी तरह से काम नहीं करता है के रूप में आप कल्पना कर सकते हैं।

क्या मेरे डेटासेट से उच्चतम वाई-वैल्यू पुनर्प्राप्त करने के लिए कोई तरीका है ताकि मैं उस मूल्य पर अधिकतम वाई-एक्सिस मैन्युअल रूप से सेट कर सकूं? या क्या कोई बेहतर विकल्प है?

संपादित करें: यहाँ फ़ाइल मैं उपयोग कर रहा हूँ है:

#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]; 

} 

उत्तर

8

ऐसा लगता है कि आप -scaleToFitPlots: उचित प्रयोग कर रहे। यदि आवश्यक हो तो यह विधि साजिश डेटा अपडेट करेगी। सुनिश्चित करें कि डेटा कॉल करने से पहले उचित डेटा उपलब्ध है।

संपादित नए कोड के आधार पर: इससे पहले कि आप ग्राफ के लिए भूखंड जोड़ने

-scaleToFitPlots: बुलाया जा रहा है। इसलिए -allPlots सरणी खाली है और स्केल करने के लिए कुछ भी नहीं है। साजिश के निर्माण के बाद स्केलिंग ऑपरेशन को ले जाएं और ग्राफ में जोड़ा गया है।

+0

मैंने पूरी फाइल को अब मेरे प्रश्न में चिपकाया है। शायद यह देखने में मदद मिलेगी कि मैं '-scaleToFitPlots:' सही तरीके से कार्यान्वित कर रहा हूं या नहीं। – zdestiny

+0

मैंने 'scaleToFitPlots' को अंत में '[self.graph addPlot: plot]' के नीचे ले जाया है और यह अब काम करता है। आपकी सहायता के लिए धन्यवाद. – zdestiny

संबंधित मुद्दे