2012-04-04 3 views
1

У меня есть диаграмма с двумя штриховыми графиками (пример: A и B).Несколько легенд заговора на панели

Для каждого часа у меня есть 2 бар.

Когда я устанавливаю легенду, я получаю образец и текст для каждого часа и бара участок.

Пример: В моей схеме есть 4 часа, то моя легенда будет как этот

AAAA

BBBB

И я только хочу

AB

Потому что на каждый час , бары означают то же самое. Как я могу это сделать ??

Я попробовал все, чтобы это произошло, но не успех до .... Теперь

Беллоу мой

// CPTLegend *theLegend = [CPTLegend legendWithGraph:barChart]; 
CPTLegend *theLegend = [CPTLegend legendWithPlots:[NSArray arrayWithObjects:[barChart plotAtIndex:0],[barChart plotAtIndex:1], nil]]; 
theLegend.numberOfRows = 1; 
theLegend.numberOfColumns = 2;//[horas count] +1/2; 
//theLegend.fill = [CPTFill fillWithColor:[CPTColor colorWithGenericGray:0.15]]; 

//theLegend.borderLineStyle = barLineStyle; 
theLegend.cornerRadius = 10.0; 
theLegend.swatchSize  = CGSizeMake(15, 15); 
//whiteTextStyle.fontSize  = 16.0; 
//theLegend.textStyle   = whiteTextStyle; 
theLegend.rowMargin  = 10.0; 
theLegend.paddingLeft  = 12.0; 
theLegend.paddingTop  = 12.0; 
theLegend.paddingRight = 12.0; 
theLegend.paddingBottom = 12.0; 

//theLegend.equalColumns = YES; 
//theLegend.equalRows = YES; 
theLegend.delegate = self; 

barChart.legend = theLegend; 

- (NSString *) legendTitleForBarPlot: (CPTBarPlot *) barPlot recordIndex :(NSUInteger) индекс {

if ([barPlot.identifier isEqual:@"Embarque"]) { 
    if (index == 0) 
    { 
     return @"Embarque"; 
    }else { 
     return @""; 
    } 
}else { 
    if (index == 0) 
    { 
     return @"Desembarque"; 
    }else { 
     return @""; 
    } 
} 

} - (BOOL) легенда: (CPTLegend *) легенда shouldDrawSwatchAtIndex: (NSUInteger) индекс forPlot: (CPTPlot *) участок inRect: (CGRect) прямоугольник InContext : (CGContextRef) контекст {

if (index == 0) { 
    return YES; 
}else{ 
    return NO; 
}  

}

ответ

1

Не реализуйте метод -legendTitleForBarPlot:recordIndex:, если вы не хотите отдельную метку для каждого бара. Используйте свойство title, чтобы установить одно название легенды для сюжета.

Метод -legend:shouldDrawSwatchAtIndex:forPlot:inRect:inContext: необходим только в том случае, если вы хотите каким-либо образом изменить рисунок образца по умолчанию.

+0

Спасибо Эрик, я прокомментировал -legendTitleForBarPlot: recordIndex: метод и -legend: shouldDrawSwatchAtIndex: forPlot: inRect: InContext: методы. Я установил свойство title для обоих моих сюжетов. Но это все еще происходит так же, как и раньше. Я попытался изменить numberOfRows на 1 и numberOfCollouns на 2, но перекрытие легенды. Пожалуйста, обратите внимание на экран печати ниже http://3.bp.blogspot.com/-QQa9LKUaJHY/T32WTHFcfOI/AAAAAAAAAGI/xpruAySamrQ/s1600/Captura+de+Tela+2012-04-05+às+ 09.50.31+ (2) .png –

+0

Вы внедрили метод '-barFillForBarPlot: recordIndex:' в свой источник данных? Это также вызовет поведение легенды. С вашего скриншота это выглядит не так, как вам нужно. –

+0

Да, я сделал. Я отправил свой полный код на другой ответ. Заранее спасибо –

0

- (недействительными) {exibirGraficoEmbarqueDescarga

// Create barChart from theme 
barChart = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; 
CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme]; 
[barChart applyTheme:theme]; 
//CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; 
//hostingView.hostedGraph = barChart; 


barChart.delegate = self; 

if (chartView == nil) 
{ 
    chartView = [[CPTGraphHostingView alloc] initWithFrame:CGRectMake(-15, 30, 350, 320)]; 
    // chartView = [[CPTGraphHostingView alloc] initWithFrame:CGRectMake(0, 35, 510, 280)]; 
    [self.view addSubview:chartView]; 

} 

chartView.hostedGraph = barChart; 

// Border 
barChart.plotAreaFrame.borderLineStyle = nil; 
barChart.plotAreaFrame.cornerRadius = 0.0f; 

// Paddings 
barChart.paddingLeft = 0.0f; 
barChart.paddingRight = 0.0f; 
barChart.paddingTop = 0.0f; 
barChart.paddingBottom = 0.0f; 

barChart.plotAreaFrame.paddingLeft = 70.0; 
barChart.plotAreaFrame.paddingTop = 20.0; 
barChart.plotAreaFrame.paddingRight = 20.0; 
barChart.plotAreaFrame.paddingBottom = 80.0; 

// Graph title 
barChart.title = @"Embarque/Descarga"; 
CPTMutableTextStyle *textStyle = [CPTTextStyle textStyle]; 
textStyle.color     = [CPTColor grayColor]; 
textStyle.fontSize    = 16.0f; 
textStyle.textAlignment   = CPTTextAlignmentCenter; 
barChart.titleTextStyle   = textStyle; 
barChart.titleDisplacement  = CGPointMake(1.0f, -20.0f); 
barChart.titlePlotAreaFrameAnchor = CPTRectAnchorTop; 

// Add plot space for horizontal bar charts 

CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; 
Apoio *apoio = [[Apoio alloc] init]; 

plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat([apoio retornaMaiorDadosGrafico:qtdEmb :qtdDesc])]; 
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(16.0f)]; 

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; 
CPTXYAxis *x   = axisSet.xAxis; 

CPTMutableLineStyle *marcacaoLineStyle = [CPTLineStyle lineStyle]; 
marcacaoLineStyle.lineColor = [CPTColor lightGrayColor]; 
marcacaoLineStyle.lineWidth = 1; 


x.axisLineStyle    = marcacaoLineStyle; 
x.majorTickLineStyle   = marcacaoLineStyle; 
x.minorTickLineStyle   = marcacaoLineStyle; 
x.majorIntervalLength   = CPTDecimalFromString(@"5"); 
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0"); 
//x.title       = @"Horas"; 
//x.titleLocation     = CPTDecimalFromFloat(15.0f); 
//x.titleOffset    = 55.0f; 

// Define some custom labels for the data elements 
x.labelingPolicy = CPTAxisLabelingPolicyNone; 
NSArray *customTickLocations = posicao;//[NSArray arrayWithObjects:[NSDecimalNumber numberWithFloat:0.7], [NSDecimalNumber numberWithFloat:2.7], [NSDecimalNumber numberWithFloat:4.7], nil]; 
NSArray *xAxisLabels   = horas;//[NSArray arrayWithObjects:@"10", @"11", @"12", nil]; 
NSUInteger labelLocation  = 0; 
NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]]; 
for (NSNumber *tickLocation in customTickLocations) { 
    CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle]; 
    newLabel.tickLocation = [tickLocation decimalValue]; 
    newLabel.offset  = x.labelOffset; //+ x.majorTickLength; 
    [customLabels addObject:newLabel]; 
} 


x.axisLabels = [NSSet setWithArray:customLabels]; 


CPTXYAxis *y = axisSet.yAxis; 
y.axisLineStyle    = marcacaoLineStyle; 
y.majorTickLineStyle   = marcacaoLineStyle; 
y.minorTickLineStyle   = marcacaoLineStyle; 
y.majorIntervalLength   = CPTDecimalFromInt([apoio retornaMaiorDadosGrafico:qtdEmb :qtdDesc]/7); //CPTDecimalFromString(@"5"); 
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0"); 
y.title = @"Containers"; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:0]; 
y.labelFormatter = formatter; 

CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; 
majorGridLineStyle.lineWidth = 0.75; 
majorGridLineStyle.lineColor = [CPTColor lightGrayColor ]; 

y.majorGridLineStyle = majorGridLineStyle ; 
y.preferredNumberOfMajorTicks = 10; 

CPTMutableTextStyle *EixostextStyle = [CPTTextStyle textStyle]; 
EixostextStyle.fontSize    = 12.0f; 

y.labelTextStyle = EixostextStyle; 
x.labelTextStyle = EixostextStyle; 

// Embaque 
CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; 
barPlot.baseValue = CPTDecimalFromString(@"0"); 
barPlot.dataSource = self; 
barPlot.delegate = self; 
barPlot.barOffset = CPTDecimalFromFloat(0.25f); 
barPlot.identifier = @"Embarque"; 
barPlot.title = @"Embarque"; 
barPlot.labelOffset = 0; 
[barChart addPlot:barPlot toPlotSpace:plotSpace]; 

//Descarga 
CPTBarPlot *barPlot2 = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; 
barPlot2.baseValue = CPTDecimalFromString(@"0"); 
barPlot2.dataSource = self; 
barPlot2.delegate = self; 
//barPlot2.barOffset = CPTDecimalFromFloat(25f); 
barPlot2.identifier  = @"Descarga"; 
barPlot2.title = @"Descarga"; 
barPlot2.labelOffset = 0; 
[barChart addPlot:barPlot2 toPlotSpace:plotSpace]; 

CPTLegend *theLegend = [CPTLegend legendWithGraph:barChart]; 
theLegend.numberOfRows = 1; 
theLegend.numberOfColumns = 2; 
theLegend.cornerRadius = 10.0; 
theLegend.swatchSize  = CGSizeMake(15, 15); 
//whiteTextStyle.fontSize  = 16.0; 
//theLegend.textStyle   = whiteTextStyle; 
theLegend.rowMargin  = 10.0; 
theLegend.paddingLeft  = 12.0; 
theLegend.paddingTop  = 12.0; 
theLegend.paddingRight = 12.0; 
theLegend.paddingBottom = 12.0; 

//theLegend.equalColumns = YES; 
//theLegend.equalRows = YES; 
barChart.legend = theLegend; 

}

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot{ 
return [horas count];} 


-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 

{ NSDecimalNumber * Num = ноль;

if ([plot isKindOfClass:[CPTBarPlot class]]) { 
    switch (fieldEnum) { 
     case CPTBarPlotFieldBarLocation:     
      if ([plot.identifier isEqual:@"Embarque"]) { 
       num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index*2]; 
      } else{ 
       num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:(index*2+1)]; 
      } 
      break;     
     case CPTBarPlotFieldBarTip: 
      if ([plot.identifier isEqual:@"Embarque"]) { 
       num = [qtdEmb objectAtIndex:index]; 
      } else{ 
       num = [qtdDesc objectAtIndex:index]; 
      }     
      break;      
    } 
} 

return num; 

}

-(CPTFill *)barFillForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)index 

{ если ([barPlot.identifier IsEqual: @ "Embarque"]) { возвращение [CPTFill fillWithColor: [CPTColor colorWithComponentRed: (175/255,0) зеленый :(238/255,0) синий: (238/255,0) альфа: 1.0]]; }

if ([barPlot.identifier isEqual:@"Descarga"]) { 
    return [CPTFill fillWithColor:[CPTColor colorWithComponentRed:(255./255.0) green:(228.0/255.0) blue:(181.0/255.0) alpha:1.0]]; 
}  

}

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index 
{ 
int valor; 
if ([plot.identifier isEqual:@"Embarque"]) 
{ 
    valor = [qtdEmb objectAtIndex:index]; 
}else{ 
    valor = [qtdDesc objectAtIndex:index]; 
} 

CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[[NSString alloc] initWithFormat:@"%@",valor]]; 
CPTMutableTextStyle *estiloTexto = [[CPTMutableTextStyle alloc] init]; 
estiloTexto.color = [CPTColor blackColor]; 
estiloTexto.fontSize = 10;  

newLayer.textStyle = estiloTexto; 
return newLayer; 

}

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