2012-04-04 46 views
1

我有一个带2条线图的图表(例如: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)RECT 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的:方法。 我设置了我的两个阴谋的标题属性。 但它仍然像以前一样发生。 我试图将de 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 – 2012-04-05 12:58:14

+0

你在数据源中实现了'-barFillForBarPlot:recordIndex:'方法吗?这也会触发传奇行为。从你的截图看,你看起来并不需要它。 – 2012-04-06 23:26:32

+0

是的,我做过。 我在另一个答案上发布了我的完整代码。 在此先感谢 – 2012-04-09 14:16:40

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)blue:(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; 

}