2012-03-21 11 views
6

Çekirdek çizim çerçevesini kullanarak çubuk grafik grafiğine ortalama yatay çizgi (veya herhangi bir tek satır) ekleme yolu var mı?Çekirdek Arsa - ortalama yatay çizgi ile çubuk grafiği

Teşekkürler.

+0

çünkü hiçbir yanıt vermeden sorularım var ... – dorin

+0

evet haklısın, ben senin sorularını inceledim ve seni çok talihsiz buldum. –

cevap

6

bir yolu CPTScatterPlot kullanmaktır: Eğer başlatıldı ve grafiğinizdeki için çubuk işaretler (ya da ne hiç gerçek veri komplodur) ekledikten sonra

Ekleme kodunuzu izinde giden.

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

Ardından veri kaynağı yöntemleri eklemek, benim durumumda ben kendine yukarıdaki kodda veri kaynağı belirledik, bu yüzden aynı dosyada veri kaynağı yöntemleri tanımlayan ediyorum:

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

Bir Dize bu şekilde karşılaştıramazsınız: plot.identifier == @ "horizontalLineForAverage", [plot.identifier isEqual: @ "horizontalLineForAverage" olarak değiştirilir. –

+0

@AndrewS Derleyici, aynı dizeye yapılan başvuruları ayırt eder. Lütfen şu cevaba bakınız: http://stackoverflow.com/questions/3703554/understanding-nsstring-comparison –

+0

Bunu Eric'in yaklaşımına tercih ediyorum, çünkü aynı başlangıç ​​ve bitiş noktalarını paylaştıkları arazileri eşit olarak ele alıyor. Bu noktalar değişirse, ortalama çizgi takip eder. –

1

Evet. Grafiğe bir dağılım grafiği ekleyin ve istenen çizginin her bir ucunda bir tane olmak üzere iki veri noktası verin. Bunu yapmanın

+0

hello @Eric Skroch Bu satırı anlamıyorum num = (NSDecimalNumber *) myDataAverageValue; myDataAverageValue ile değiştirebileceğim bir örnekle bana söyler misiniz? Teşekkürler .. – Warewolf

+0

"NSDecimalNumber" ile kodlanmış arsa için y değeri. –

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

ve

-(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; 

} 

Resmi örnek "Plot_Gallery_iOS"

"AxisDemo" bölümüne bakın
İlgili konular