多条形图图例

时间:2012-04-04 19:40:43

标签: core-plot

我有一个带有2个条形图的图表(例如:A和B)。

每小时我有2个柱状图。

当我设置图例时,我会获得每小时和每小时的色板和文字 情节。

示例:在我的图表中有4个小时,那么我的传奇就像这样

A A A A

B B B B

我只想要

A B

因为每小时,条形意味着相同。 我怎样才能做到这一点 ??

我已经尝试了一切来实现这一目标,但直到现在都没有成功......

贝娄是我的

// 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)index {

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 *)plot inRect:(CGRect)rect inContext:(CGContextRef)context {

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

}

2 个答案:

答案 0 :(得分:1)

除非您希望每个条形图都有单独的标签,否则请勿实施-legendTitleForBarPlot:recordIndex:方法。使用title属性为绘图设置单个图例标题。

只有在您想以某种方式更改默认色板绘图时才需要-legend:shouldDrawSwatchAtIndex:forPlot:inRect:inContext:方法。

答案 1 :(得分: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 = nil;

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

}