4

Core Plot棒グラフを使用して、会社の成長率をプロットしています。x軸のラベルとして、会社の銘柄記号をそれぞれのバーの下の中央に配置したいと思います。残念ながら、xラベルを正しく中央に配置する方法を探すのに何時間も費やしましたが、コードを使用しても成功しませんでした。x軸ラベルを正しく中央に配置するにはどうすればよいですか?

私のチャートの設定は次のとおりです。

CPTBarPlot *barPlot     = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO];

barPlot.baseValue       = CPTDecimalFromInt(0);
barPlot.barOffset       = CPTDecimalFromFloat(0.5f);
barPlot.barWidth        = CPTDecimalFromFloat(0.5f);

double xAxisStart = 0;
double xAxisLength = self.companies.count;

double yAxisStart = 0;
double yAxisLength = 0.5;

CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xAxisStart) length:CPTDecimalFromDouble(xAxisLength + 1.0)] ;
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(yAxisStart) length:CPTDecimalFromDouble(yAxisLength)] ;

barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(+0.0) length:CPTDecimalFromDouble(xAxisLength)] ;

次のコードスニペットでは、カスタムラベルを使用しようとしましたが、以下のサンプルチャートに示すように成功しませんでした。

xAxis.labelingPolicy = CPTAxisLabelingPolicyNone;

NSMutableArray *customLabels = [[NSMutableArray alloc]init];

[self.companies enumerateObjectsUsingBlock:^(IBCompany *company, NSUInteger idx, BOOL *stop) {
    NSString *labelText = company.contrSymbol;
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:labelText textStyle:xAxis.labelTextStyle];
    label.tickLocation = CPTDecimalFromDouble(idx + 0.5);
    label.offset = xAxis.labelOffset + xAxis.majorTickLength;
    label.rotation    = M_PI * 2;
    [customLabels addObject:label];
    }];
  xAxis.axisLabels = [NSSet setWithArray:customLabels];

ラベルの位置が正しくない棒グラフ

棒グラフのインデックスは1で始まることに注意してください:

-(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange
    {
    if ( [plot.identifier isEqual:plotIdentifier] ) {;

    if ( fieldEnum == CPTScatterPlotFieldX ) {
        NSMutableArray *indexArray = [[NSMutableArray alloc] init];

        [self.companies enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            [indexArray addObject:[NSDecimalNumber numberWithInt: idx + 1]];
        }];
        return [indexArray copy];
    }
    else if ( fieldEnum == CPTScatterPlotFieldY ) {
        // ..
    }
}
else return nil; // should be considered as ERROR

}

4

1 に答える 1

5
  1. データソースで適切なプロットタイプのフィールド識別子を使用する習慣を身に付ける必要があります。バープロットの場合は、とを使用する必要がCPTBarPlotFieldBarLocationありCPTBarPlotFieldBarTipます。この場合、違いはありませんが、他の種類のプロットでは必ずしもそうとは限りません。たとえば、水平棒グラフの場合、x座標とy座標が逆になります。

  2. データソースは常に同じデータセットを返します。indexRangeパラメータを確認し、要求された範囲のみを返す必要があります。

  3. x軸のプロット範囲は0から4の間です。ラベルは0.5、1.5、および2.5です。これplotRangeがバーの間隔を台無しにしているものです。デフォルトのに設定したままにすると、nil希望の外観が得られます。plotRangeドキュメントから:

プロット範囲が指定されている場合、バーはプロット範囲全体で等間隔に配置されます。plotRangeがnilの場合、棒グラフの場所はCocoaバインディングまたは棒グラフデータソースによって提供されます。バインディングまたはデータソースのいずれかによって場所が提供されていない場合、最初のバーはゼロ(0)に配置され、後続のバーは連続する正の整数座標に配置されます。

于 2012-10-07T20:11:49.250 に答える