2012-03-21 13 views

Odpowiedz

6

Jednym ze sposobów osiągnięcia tego celu jest wykorzystywanie CPTScatterPlot:

Dodaj następujące linie do swojego kodu po inicjalizacji i dodał pasek terenu (lub co kiedykolwiek rzeczywisty działka dane IS) do wykresu.

// Before following code, initialize your data, actual data plot and add plot to graph 

CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; 
CPTMutableLineStyle * lineStyle      = [CPTMutableLineStyle lineStyle]; 
lineStyle.lineWidth    = 3.f; 
lineStyle.lineColor    = [CPTColor blackColor]; 
lineStyle.dashPattern   = [NSArray arrayWithObjects:[NSNumber numberWithFloat:3.0f], [NSNumber numberWithFloat:3.0f], nil]; 
dataSourceLinePlot.dataLineStyle = lineStyle; 
dataSourceLinePlot.identifier = @"horizontalLineForAverage"; 
dataSourceLinePlot.dataSource = self; 
[barChart addPlot:dataSourceLinePlot toPlotSpace:plotSpace]; 

Następnie dodać metody źródła danych, w moim przypadku mam ustawić źródło danych w powyższym kodzie do siebie, więc jestem definiowanie metod źródła danych w tym samym pliku:

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{ 
// Note this method will return number of records for both my actual plot, and for scattered plot which is used to draw horizontal average line. For latter, this will decide the horizontal length of your line 
    return [myDataArray count]; 
} 

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{ 
    NSDecimalNumber *num = nil; 

     // If method is called to fetch data about drawing horizontal average line, then return your generated average value. 
    if([email protected]"horizontalLineForAverage") 
    { 
     if(fieldEnum == CPTScatterPlotFieldX) 
     { 
        // this line will remain as it is 
      num =(NSDecimalNumber *)[NSDecimalNumber numberWithDouble:index]; 
     } 
     else 
     { 
      num = (NSDecimalNumber *) myDataAverageValue;// Here you generate average value for location of horizontal line. You should edit this line only; 
     } 
    } 
// handle other cases and return data for other plots  
    return num; 
} 
+0

Nie można porównać String w ten sposób: plot.identifier == @ "horizontalLineForAverage" Zmień na [plot.identifier isEqual: @ "horizontalLineForAverage"] –

+0

@AndrewS Kompilator ujednolica odniesienia do tego samego ciągu znaków. Proszę zobaczyć tę odpowiedź: http://stackoverflow.com/questions/3703554/understanding-nsstring-comparison –

+0

Wolę to podejście Eric, ponieważ traktuje fabuł równo, gdzie mają ten sam punkt początkowy i końcowy. Jeśli te punkty ulegną zmianie, nastąpi następująca linia średnia. –

1

Tak. Dodaj wykres rozproszenia do wykresu i podaj dwa punkty danych - po jednym na każdym końcu żądanej linii.

+0

hello @Eric Skroch Nie rozumiem tej linii num = (NSDecimalNumber *) myDataAverageValue; chciałbyś mi powiedzieć na przykład, co mogę zastąpić myDataAverageValue. Dzięki .. – Warewolf

+0

Jest to wartość Y dla wykresu, zakodowana w 'NSDecimalNumber'. –

0
CPTFill *bandFill = [CPTFill fillWithColor:[[CPTColor blackColor] colorWithAlphaComponent:1]]; 
    [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(800) length:CPTDecimalFromDouble(1.5)] fill:bandFill]]; 

i

-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate 
{ 
    if (self.segment.selectedSegmentIndex == 2) { 
     if (coordinate == CPTCoordinateY) { 

      //NSLog(@"%f=>%f",self.yRange.lengthDouble,newRange.lengthDouble); 

      CPTGraph* graph = space.graph; 
      CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
      CPTXYAxis *y = axisSet.yAxis; 
      NSArray *bands = y.backgroundLimitBands; 
      for (CPTLimitBand *band in bands) { 
       [y removeBackgroundLimitBand:band]; 
      } 

      CPTFill *bandFill = [CPTFill fillWithColor:[[CPTColor blackColor] colorWithAlphaComponent:1]]; 
      [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(800) length:CPTDecimalFromDouble(1.5 * newRange.lengthDouble/1200)] fill:bandFill]]; 
     } 

    } 

    return newRange; 

} 

proszę odnieść się do sekcji "AxisDemo" oficjalnej próbki "Plot_Gallery_iOS"

Powiązane problemy