2

以下のような棒グラフを作成しようとしています.x軸には2つの異なるラベルがあります.1つはバー自体のラベルで、パフォーマンスを示し、もう1つは軸の下部にあり、年を示しています. 上部ではなく、グラフ上で数値のみを回転して表示する必要があります。

棒グラフ

カスタムラベルを作成して年を表示しています。メソッドを実装することで、バーのパフォーマンス数値を表示することもでき-dataLabelForPlot:recordIndex:ます。パフォーマンスの数値は水平に表示されますが、パフォーマンスの数値を 90 度回転できるようにしたいと考えています。カスタム ラベルを追加できるように を に設定したため、プロットで を設定しlabelRotationても役に立ちません。labelingPolicyCPTAxisLabelingPolicyNone

以下は私のコードです:

-(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];
}

バーのパフォーマンス数値を回転するにはどうすればよいですか? どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

3

プロットと軸の両方に、独自の独立したlabelRotationプロパティがあります。カスタム軸ラベルの回転を設定する必要がありlabelRotationますが、バー プロットのプロパティでバーの上のデータ ラベルの回転を設定する必要があります。

于 2012-05-28T22:36:49.900 に答える