Core Plot - a histogram with a middle horizontal line

Is there any way to add the middle horizontal line (or any single line) to the histogram plot using the frame of the main plot?

Thanks.

+6
source share
3 answers

One way to do this is to use CPTScatterPlot:

Add the following lines to your code after initialization and add your graph (or whatever your actual data graph is) to your graph.

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

Then add the data source methods, in my case I installed the data source in the code above, so I define the data source methods in the same file:

 -(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( plot.identifier==@ "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; } 
+6
source

Yes. Add a scatterplot to the plot and give it two data points - one at each end of the line you want.

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

and

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

refer to the "AxisDemo" section of the official "Plot_Gallery_iOS" sample

0
source

Source: https://habr.com/ru/post/911283/


All Articles