Базовый график - гистограмма со средней горизонтальной линией - PullRequest
6 голосов
/ 21 марта 2012

Есть ли способ добавить среднюю горизонтальную линию (или любую отдельную линию) к диаграмме гистограммы, используя базовую структуру графика?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 11 апреля 2012

Один из способов сделать это - использовать CPTScatterPlot:

Добавьте следующие строки в свой код после того, как вы инициализировали и добавили свой гистограмму (или каков ваш фактический график данных) к вашему графику.

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

Затем добавьте методы источника данных, в моем случае я установил для источника данных в вышеприведенном коде значение self, поэтому я определяю методы источника данных в том же файле:

-(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;
}
1 голос
/ 22 марта 2012

Да. Добавьте график рассеяния на график и задайте ему две точки данных - по одной на каждом конце желаемой линии.

0 голосов
/ 12 ноября 2014
    CPTFill *bandFill = [CPTFill fillWithColor:[[CPTColor blackColor] colorWithAlphaComponent:1]];
    [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(800) length:CPTDecimalFromDouble(1.5)] fill:bandFill]];

и

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

}

пожалуйста, обратитесь к разделу «AxisDemo» официального образца «Plot_Gallery_iOS»

...