2012-04-04 5 views
1

Ich habe ein Diagramm mit 2 Balken-Plots (Beispiel: A und B).Multiple Bar Plot-Legende

Für jede Stunde habe ich 2 bar Grundstücke.

Wenn ich die Legende lege, bekomme ich swatch und Text für jede Stunde und bar Plot.

Beispiel: In meinem Diagramm haben 4 Stunden, dann wird meine Legende wie dieser sein

AAAA

BBBB

und ich möchte nur

AB

Da jede Stunde auf Die Balken bedeuten dasselbe. Wie kann ich das tun ??

ich alles versucht haben, dies zu machen, aber keinen Erfolg bis jetzt ....

Bellow ist mein

// 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 Record :(NSUInteger) index {

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

} - (BOOL) Legende: (CPTLegend *) Legende shouldDrawSwatchAtIndex: (NSUInteger) Index forPlot: (CPTPlot *) Grundstück inRect: (CGRect) rect InContext : (CGContextRef) Kontext {

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

}

Antwort

1

Sie die -legendTitleForBarPlot:recordIndex: Methode nicht implementieren, wenn Sie ein separates Etikett für jede Bar wollen. Verwenden Sie die Eigenschaft title, um einen einzelnen Legendentitel für das Diagramm festzulegen.

Die Methode -legend:shouldDrawSwatchAtIndex:forPlot:inRect:inContext: wird nur benötigt, wenn Sie die Standard-Farbfeldzeichnung in irgendeiner Weise ändern möchten.

+0

Dank Eric, kommentierte ich -legendTitleForBarPlot: Record: Methode und -legend: shouldDrawSwatchAtIndex: forPlot: inRect: InContext: Methoden. Ich legte die Titeleigenschaft meiner beiden Handlung. Aber es passiert immer noch das gleiche wie zuvor. Ich habe versucht, De NumberOfRows auf 1 und NumberOfCollouns auf 2 zu ändern, aber die Legende überlappen. Bitte werfen Sie einen Blick auf das Druckbild unten http://3.bp.blogspot.com/-QQa9LKUaJHY/T32WTHFcfOI/AAAAAAAAAGI/xpruAySamrQ/s1600/Captura+de+Tela+2012-04-05+às+ 09.50.31+ (2) .png –

+0

Haben Sie die Methode '-barFillForBarPlot: recordIndex: 'in Ihrer Datenquelle implementiert? Dadurch wird auch das Legendenverhalten ausgelöst. Von Ihrem Screenshot aus sieht es nicht so aus, als würden Sie es brauchen. –

+0

Ja, das habe ich getan. Ich habe meinen vollständigen Code auf eine andere Antwort geschrieben. Vielen Dank im Voraus –

0

- (void) {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 = null;

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 

{ if ([barPlot.identifier isEqual: @ "Embarque"]) { return [CPTFill fillWithColor: [CPTColor colorWithComponentRed: (175/255,0) grün :(238/255.0) blau: (238/255.0) alpha: 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; 

}