2014-01-26 2 views
0

Я стараюсь правильно расположить свой барчарт. Я бы хотел иметь не более 10 горизонтальных баров, закрепленных на вершине с шириной сетки и расстоянием между барами.CorePlot - расстояние от баров в гистограмме

#define kBarHeight 20 
#define kBarSpacing 8 
myPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt([self.data count]*(kBarHeight+kBarSpacing)) length:CPTDecimalFromInt([self.data count]*(kBarHeight+kBarSpacing) * -1)]; 

негативов, потому что я пытаюсь также получить this effect

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

switch (fieldEnum) { 
    case CPTBarPlotFieldBarTip: 
     if ([plot.identifier isEqual:@"dataset1"]) { 
      num = [NSNumber numberWithInteger:[self.dataSet1[index] count]]; 
     } else { 
      num = [NSNumber numberWithInteger:[self.dataSet2[index] count]]; 

     } 
     break; 

    default: 
     num = [NSNumber numberWithInteger:(index*(kBarHeight + kBarSpacing)) + kBarHeight/2 ]; 
     break; 
} 
return num; 

} 

Я думал, выше будет работать, но все бары находятся на вершине друг друга в нижней части графика, и отрезать половину пути, но они все равно равномерно распределены и не прослушивают значение интервала между строками, которое я устанавливаю. , Мысли?

Edit: Полный график настройки:

#pragma mark - 
#pragma mark - Chart behavior 
-(void)initPlot { 
    [self configureGraph]; 
    [self configurePlots]; 
    [self configureAxes]; 
} 

-(void)configureGraph { 

    CPTGraph *dataSet2Graph = [[CPTXYGraph alloc] initWithFrame:self.dataSet2Graph.bounds]; 
    CPTGraph *dataSet1Graph = [[CPTXYGraph alloc] initWithFrame:self.dataSet1Graph.bounds]; 

    dataSet2Graph.plotAreaFrame.masksToBorder = NO; 
    dataSet1Graph.plotAreaFrame.masksToBorder = NO; 

    dataSet2Graph.paddingLeft = 150.0; 
    dataSet1Graph.paddingLeft = 150.0; 

    self.dataSet2Graph.hostedGraph = dataSet2Graph; 
    self.dataSet1Graph.hostedGraph = dataSet1Graph; 


    CPTXYPlotSpace *dataSet2PlotSpace = (CPTXYPlotSpace *) dataSet2Graph.defaultPlotSpace; 
    CSGeoStat *stat = (CSGeoStat *) self.dataSet2Data[0]; //Biggest dataSet2 count 

    dataSet2PlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(stat.count * 1.1)]; 
    dataSet2PlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt([self.dataSet2Data count]) length:CPTDecimalFromInt(-1 * [self.dataSet2Data count])]; 

    CPTXYPlotSpace *dataSet1PlotSpace = (CPTXYPlotSpace *) dataSet1Graph.defaultPlotSpace; 
    stat = (CSGeoStat *) self.dataSet1Data[0]; //Biggest tz count 

    dataSet1PlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(stat.count * 1.1)]; 
    dataSet1PlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt([self.dataSet1Data count]*(kBarHeight+kBarSpacing)) length:CPTDecimalFromInt([self.dataSet1Data count]*(kBarHeight+kBarSpacing) * -1)]; 




    [self.dataSet2Graph setFrame:CGRectMake(self.dataSet2Graph.frame.origin.x, 
              self.dataSet2Graph.frame.origin.y, 
              self.dataSet2Graph.frame.size.width, 
              (int)([self.dataSet2Data count]*(kBarHeight+kBarSpacing)*1.2))]; 
    [self.dataSet1Graph setFrame:CGRectMake(self.dataSet1Graph.frame.origin.x, 
              self.dataSet1Graph.frame.origin.y, 
              self.dataSet1Graph.frame.size.width, 
              (int)([self.dataSet1Data count]*(kBarHeight+kBarSpacing)*1.2))]; 


} 

-(void)configurePlots { 




    CPTBarPlot *dataSet2Plot = [[CPTBarPlot alloc] init]; 
    dataSet2Plot.barsAreHorizontal    = YES; 
    dataSet2Plot.barCornerRadius    = CPTFloat(1.0); 
    dataSet2Plot.identifier = @"CountryPlot"; 
    dataSet2Plot.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:19/255 green:221/255 blue:187/255 alpha:1]]; 



    CPTBarPlot *dataSet1Plot = [[CPTBarPlot alloc] init]; 
    dataSet1Plot.barsAreHorizontal    = YES; 
    dataSet1Plot.barCornerRadius    = CPTFloat(1.0); 
    dataSet1Plot.identifier = @"TimeZonePlot"; 
    dataSet1Plot.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:19/255 green:221/255 blue:188/255 alpha:1]]; 


    CPTMutableLineStyle *barLineStyle = [[CPTMutableLineStyle alloc] init]; 
    barLineStyle.lineColor = [CPTColor clearColor]; 
    barLineStyle.lineWidth = 0.5; 

    CPTGraph *dataSet2Graph = self.dataSet2Graph.hostedGraph; 
    CPTGraph *dataSet1Graph = self.dataSet1Graph.hostedGraph; 

    dataSet2Plot.dataSource = self; 
    dataSet2Plot.delegate = self; 
    dataSet2Plot.barWidth = CPTDecimalFromDouble(kBarHeight); 
    dataSet2Plot.barWidthsAreInViewCoordinates = YES; 
    dataSet2Plot.baseValue = CPTDecimalFromString(@"0"); 
    dataSet2Plot.lineStyle = barLineStyle; 
    dataSet2Plot.barOffset = CPTDecimalFromFloat(0.25f); 
    dataSet2Plot.labelOffset = -5.0; 
    [dataSet2Graph addPlot:dataSet2Plot toPlotSpace:dataSet2Graph.defaultPlotSpace]; 


    dataSet1Plot.dataSource = self; 
    dataSet1Plot.delegate = self; 
    dataSet1Plot.baseValue = CPTDecimalFromString(@"0"); 
    dataSet1Plot.barWidth = CPTDecimalFromDouble(kBarHeight); 
    dataSet1Plot.barWidthsAreInViewCoordinates = YES; 

    dataSet1Plot.lineStyle = barLineStyle; 
    dataSet1Plot.labelOffset = -5.0; 
    dataSet1Plot.barOffset = CPTDecimalFromFloat(0.25f); 

    [dataSet1Graph addPlot:dataSet1Plot toPlotSpace:dataSet1Graph.defaultPlotSpace]; 

} 



-(void)configureAxes { 



    CPTXYAxisSet *dataSet2AxisSet = (CPTXYAxisSet *) self.dataSet2Graph.hostedGraph.axisSet; 

    CPTXYAxis *x = dataSet2AxisSet.xAxis; 

    x.labelingPolicy = CPTAxisLabelingPolicyNone; 
    x.axisLineStyle = nil; 

    CPTXYAxis *y = dataSet2AxisSet.yAxis; 

    y.labelingPolicy = CPTAxisLabelingPolicyNone; 
    y.axisLineStyle = nil; 


    NSMutableArray *customLabels = [[NSMutableArray alloc]init]; 

    [self.dataSet2Data enumerateObjectsUsingBlock:^(CSGeoStat *stat, NSUInteger idx, BOOL *stop) { 
     NSString *labelText = stat.term; 
     CPTMutableTextStyle *textStyle = [y.labelTextStyle mutableCopy]; 
     textStyle.color = [CPTColor whiteColor]; 

     CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:labelText textStyle:textStyle]; 
     label.tickLocation = CPTDecimalFromInt((idx*(kBarHeight + kBarSpacing)) + kBarHeight/2); 
     label.offset = y.labelOffset + y.majorTickLength; 
     label.rotation = M_PI * 2; 
     [customLabels addObject:label]; 
    }]; 
    y.axisLabels = [NSSet setWithArray:customLabels]; 


    CPTXYAxisSet *dataSet1AxisSet = (CPTXYAxisSet *) self.dataSet1Graph.hostedGraph.axisSet; 

    CPTXYAxis *x2 = dataSet1AxisSet.xAxis; 

    x2.labelingPolicy = CPTAxisLabelingPolicyNone; 
    x2.axisLineStyle = nil; 

    CPTXYAxis *y2 = dataSet1AxisSet.yAxis; 

    y2.labelingPolicy = CPTAxisLabelingPolicyNone; 
    y2.axisLineStyle = nil; 

    NSMutableArray *customLabels2 = [[NSMutableArray alloc]init]; 

    [self.dataSet1Data enumerateObjectsUsingBlock:^(CSGeoStat *stat, NSUInteger idx, BOOL *stop) { 
     NSString *labelText = stat.term; 
     CPTMutableTextStyle *textStyle = [y2.labelTextStyle mutableCopy]; 
     textStyle.color = [CPTColor whiteColor]; 

     CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:labelText textStyle:textStyle]; 
     label.tickLocation = CPTDecimalFromInt((idx*(kBarHeight + kBarSpacing)) + kBarHeight/2); 
     label.offset = y2.labelOffset + y2.majorTickLength; 
     label.rotation = M_PI * 2; 
     [customLabels2 addObject:label]; 
    }]; 
    y2.axisLabels = [NSSet setWithArray:customLabels2]; 




} 
+0

Получены ли цифры, возвращаемые с источника данных, что вы ожидаете? Если это так, проблема заключается в настройке оси или графика. –

+0

Да, я так думаю. Я теперь привязал свой полный график, настроенный –

+1

Являются ли два представления хостинга правильно размещенными в их родительском представлении? Правильно ли размер? (Представление хостинга сделает его размещенный граф подходящим для представления хостинга.) Трудно сказать, что происходит, поскольку представления и графики хостинга имеют одинаковые имена. «YRange» двух пространств графика отличается. Это намеренно? –

ответ

0

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

-(void)configureGraph { 

    CPTGraph *dataSet1Graph = [[CPTXYGraph alloc] initWithFrame:self.dataSet1Graph.bounds]; 
    CPTGraph *dataSet2Graph = [[CPTXYGraph alloc] initWithFrame:self.dataSet2Graph.bounds]; 

    dataSet1Graph.plotAreaFrame.masksToBorder = NO; 
    dataSet2Graph.plotAreaFrame.masksToBorder = NO; 

    dataSet1Graph.paddingLeft = 150.0; 
    dataSet2Graph.paddingLeft = 150.0; 

    self.dataSet1Graph.hostedGraph = dataSet1Graph; 
    self.dataSet2Graph.hostedGraph = dataSet2Graph; 


    CPTXYPlotSpace *dataSet1PlotSpace = (CPTXYPlotSpace *) dataSet1Graph.defaultPlotSpace; 
    CSGeoStat *stat = (CSGeoStat *) self.dataSet1Data[0]; //Biggest dataSet1 count 

    dataSet1PlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(stat.count * 1.1)]; 
    dataSet1PlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt([self.dataSet1Data count]*(kBarHeight+kBarSpacing)) length:CPTDecimalFromInt(-1 * [self.dataSet1Data count]*(kBarHeight+kBarSpacing))]; 

    CPTXYPlotSpace *dataSet2PlotSpace = (CPTXYPlotSpace *) dataSet2Graph.defaultPlotSpace; 
    stat = (CSGeoStat *) self.dataSet2Data[0]; //Biggest tz count 

    dataSet2PlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(stat.count * 1.1)]; 
    dataSet2PlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt([self.dataSet2Data count]*(kBarHeight+kBarSpacing)) length:CPTDecimalFromInt([self.dataSet2Data count]*(kBarHeight+kBarSpacing) * -1)]; 




    [self.dataSet1Graph setFrame:CGRectMake(self.dataSet1Graph.frame.origin.x, 
              self.dataSet1Graph.frame.origin.y, 
              self.dataSet1Graph.frame.size.width, 
              (int)([self.dataSet1Data count]*(kBarHeight+kBarSpacing) + kBarHeight))]; 
    [self.dataSet2Graph setFrame:CGRectMake(self.dataSet2Graph.frame.origin.x, 
              self.dataSet2Graph.frame.origin.y, 
              self.dataSet2Graph.frame.size.width, 
              (int)([self.dataSet2Data count]*(kBarHeight+kBarSpacing) + kBarHeight))]; 


} 
Смежные вопросы