2012-05-28 112 views
2

我正在嘗試創建一個類似於下圖的條形圖 - x軸有兩個不同的標籤 - 一個是條形自身的標籤,表示性能,另一個位於軸的底部,表示年份。只有數字需要顯示在圖上而不是頂部。如何在帶有coreplot的條形圖上同時使用自定義標籤和單獨條形標籤?

bar graph

我通過創建自定義的標籤顯示了多年。通過實施-dataLabelForPlot:recordIndex:方法,我也能夠顯示酒吧的表現數據。性能數據顯示但水平,但我想能夠旋轉90度的性能數字。 在圖上設置labelRotation並不會幫助,因爲我已將labelingPolicy設置爲CPTAxisLabelingPolicyNone,因此我可以添加自定義標籤。

下面是我的代碼:

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index 
{ 
    CPTMutableTextStyle *axisTitleTextStyle = [CPTMutableTextStyle textStyle]; 
    axisTitleTextStyle.fontSize = 10.0; 
    axisTitleTextStyle.color = [CPTColor blackColor]; 

    CPTTextLayer *label = [[CPTTextLayer alloc] init]; 
    label.textStyle = axisTitleTextStyle; 
    if ([plot isKindOfClass:[CPTBarPlot class]]) { 
     if ([plot.identifier isEqual:@"Fund"]) { 
      label.text = [[[self dataGroup1] objectAtIndex:index] stringValue]; 
     } 
     else if ([plot.identifier isEqual:@"Benchmark"]) { 
      label.text = [[[self dataGroup2] objectAtIndex:index] stringValue]; 
     } 

    } 
    return [label autorelease]; 
} 


- (void) drawGraph 
{ 
    graphHostingView_ = [[CPTGraphHostingView alloc] initWithFrame:self.bounds]; 

    calPerfGraph_ = [[CPTXYGraph alloc] initWithFrame:self.bounds]; 
    graphHostingView_.hostedGraph = calPerfGraph_; 

    [self addSubview:graphHostingView_]; 

    calPerfGraph_.plotAreaFrame.masksToBorder = NO; 

    calPerfGraph_.paddingLeft = 5.0; 
    calPerfGraph_.paddingTop = 20.0; 
    calPerfGraph_.paddingRight = 10.0; 
    calPerfGraph_.paddingBottom =20.0; 

    calPerfGraph_.plotAreaFrame.paddingTop = 10.0; 
    calPerfGraph_.plotAreaFrame.paddingBottom = 50.0; 
    calPerfGraph_.plotAreaFrame.paddingLeft = 10.0; 
    calPerfGraph_.plotAreaFrame.paddingRight = 35.0; 

    // Y axis scale - round to nearest ten 
    int maxYScale = (([[self getPositiveMax] intValue]/10) + 1) * 10; 
    int minYScale = (([[self getNegativeMax] intValue]/10) + 1) * 10; 

    // Styles 
    CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
    lineStyle.lineColor = [CPTColor grayColor]; 
    lineStyle.lineWidth = 2.0f; 

    CPTMutableLineStyle *gridLineStyle = [CPTMutableLineStyle lineStyle]; 
    gridLineStyle.lineColor = [CPTColor grayColor]; 
    gridLineStyle.lineWidth = 1.0f; 

    // X axis 
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)calPerfGraph_.axisSet; 
    axisSet.xAxis.minorTicksPerInterval = 0; 
    axisSet.xAxis.majorTickLineStyle = lineStyle; 
    axisSet.xAxis.axisLineStyle = lineStyle; 
    axisSet.xAxis.majorTickLength = 0; 
    axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyNone; 
    axisSet.xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0]; // Bring labels to the bottom on the plot 
    axisSet.xAxis.labelRotation = M_PI/2; 

    int currentYear = [self getCurrentYear]; 
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:6]; 
    for (int i=currentYear-5,count=1; currentYear>=i; i++,count++) { 
     CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%d",i] textStyle:axisSet.xAxis.labelTextStyle]; 
     newLabel.tickLocation = CPTDecimalFromInt(count); 
     newLabel.offset = axisSet.xAxis.labelOffset + axisSet.xAxis.majorTickLength; 
     [customLabels addObject:newLabel]; 
     [newLabel release]; 
    } 
    axisSet.xAxis.axisLabels = [NSSet setWithArray:customLabels]; 

    // Y axis 
    if (maxYScale >= 40 || minYScale >= 40) { 
     axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"20"] decimalValue]; 
    } 
    else { 
     axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"10"] decimalValue]; 
    } 

    axisSet.yAxis.minorTicksPerInterval = 0; 
    axisSet.yAxis.majorTickLength = 0; 
    axisSet.yAxis.majorGridLineStyle = gridLineStyle; 
    axisSet.yAxis.axisLineStyle = nil; 
    axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithUpperOffset:0]; // Bring labels to the right end of the plot 
    axisSet.yAxis.tickDirection = CPTSignPositive; 

    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)calPerfGraph_.defaultPlotSpace; 
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble([[self calPerfFundData] count]+1)]; 
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-minYScale) length:CPTDecimalFromDouble(minYScale + maxYScale)]; 

    CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor greenColor] horizontalBars:NO];  
    barPlot.baseValue = CPTDecimalFromString(@"0"); 
    barPlot.dataSource = self; 
    barPlot.barOffset = CPTDecimalFromFloat(.7); 
    barPlot.identifier = @"Fund"; 
    barPlot.barWidth = CPTDecimalFromFloat(.25); 
    [barPlot addAnimation:[self animateVerticalBars] forKey:@"FundAnimation"]; 
    [calPerfGraph_ addPlot:barPlot toPlotSpace:plotSpace]; 

    CPTBarPlot *bbarPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor colorWithComponentRed:0.9 green:0.9 blue:0.9 alpha:0.8] horizontalBars:NO];  
    bbarPlot.baseValue = CPTDecimalFromString(@"0"); 
    bbarPlot.dataSource = self; 
    bbarPlot.barOffset = CPTDecimalFromFloat(1); 
    bbarPlot.barWidth = CPTDecimalFromFloat(.25); 
    bbarPlot.identifier = @"Benchmark"; 
    [bbarPlot addAnimation:[self animateVerticalBars] forKey:@"BenchmarkAnimation"]; 
    [calPerfGraph_ addPlot:bbarPlot toPlotSpace:plotSpace]; 
} 

如何旋轉上槓表現人物?任何幫助表示讚賞。 謝謝。

回答

3

這兩個圖和軸都有自己的獨立labelRotation屬性。您將負責設置自定義軸標籤的旋轉,但條形圖的labelRotation屬性應該爲條上方的數據標籤設置旋轉角度。

+0

謝謝埃裏克。在劇情上設置此屬性的作品。 – EmmKay