1

Core Plot を使用して iPhone アプリでグラフを描画しようとしています。アプリからのそのようなグラフの 1 つを次に示します。

ここに画像の説明を入力

ご覧のとおり、X 軸のラベルには 1,2,3... のラベルしか表示されていませんが、対応する日付が表示されるように構成しています。このグラフは数分ごとに再描画されます。再描画すると、以下に示すように、x 軸のラベル (つまり、日付の値) が正しく表示されます。

ここに画像の説明を入力

初めて、それはちょうど1,2,3を示しています....

X 軸ラベルを設定するにはどうすればよいですか?

グラフの他のすべてのパラメーター (色、パディングなど) を設定するときではなく、「numberOfRecordsForPlot」で実行しています。これは、グラフの色などを設定した後にのみプロットの値を取得するためです。そのため、numberOfRecordsForPlot() で、両方の軸の軸範囲を計算します (数分ごとに取得される値に応じて)また、カスタムの目盛りの位置と x 軸ラベルを計算し、そこに設定します。コード スニペットは次のとおりです。

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
...
...

NSArray *customTickLocations = [NSArray arrayWithObjects :
                                [NSDecimalNumber numberWithInt:0],
                                [NSDecimalNumber numberWithInt:1],
                                [NSDecimalNumber numberWithInt:2],
                                [NSDecimalNumber numberWithInt:3],
                                [NSDecimalNumber numberWithInt:4],
                                nil];
// assume that we are plotting 5 points at a time
NSMutableArray *xAxisLabels = [[NSMutableArray alloc] init];
for (int i=0; i<self.arrayKeys.count ; i++) {

    NSString *myData = [dict objectForKey:[self.arrayKeys objectAtIndex:i]];
    if ((myData == nil) || (myData == NULL)) {
        NSLog(@"WARN : Invalid data");
        continue;
    }
    NSDate *date = (NSDate *) [self.arrayKeys objectAtIndex:i];
    [xAxisLabels addObject:date];
}
NSUInteger labelLocation = 0;
NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:xAxisLabels.count];
CPTMutableTextStyle *textStyle = [[CPTMutableTextStyle alloc] init];
textStyle.fontSize = 10.0;
textStyle.color = [CPTColor darkGrayColor];
for (int i=0 ; i<dictHealth.count ; i++) {
    NSNumber *tickLocation = [customTickLocations objectAtIndex:i];
    NSDateComponents *dateComponents = [self getComponentFromDate:
                                        (NSDate *)[xAxisLabels objectAtIndex:labelLocation++]];
    CPTAxisLabel *newLabel = [[CPTAxisLabel alloc]
                              initWithText:[NSString stringWithFormat:@"%d-%d-%d\n%d:%d:%d",
                                            dateComponents.year, dateComponents.month, dateComponents.day,
                                            dateComponents.hour, dateComponents.minute, dateComponents.second]
                              textStyle:textStyle];
    newLabel.tickLocation = [tickLocation decimalValue];
    newLabel.offset = 7.5;
    newLabel.rotation = M_PI/3;
    [customLabels addObject:newLabel];
}
axisSet.xAxis.axisLabels =  [NSSet setWithArray:customLabels];

...
...
}

誰か助けてくれませんか?

4

1 に答える 1

2

データソースで多くの計算やグラフ構成を行わないでください。-numberOfRecordsForPlot:データ読み込みサイクル中に複数回呼び出すことができます。データ ソースに対してデータのクエリが実行されるまでに、使用可能なデータ量がすでにわかっているはずです。データ数の計算は、インスタンス変数の読み取りやcountコレクションの取得と同じくらい簡単でなければなりません。

軸の設定は通常、View Controller の機能です。新しいデータを受け取ったときにプロット スペースの範囲を調整し、新しい軸ラベルを作成する必要がある場合は、コントローラーで行います。

プロット データは、表示方法とは無関係です。データを取得する前にグラフを描画する場合は、作成時にプロット範囲と軸ラベルに適切なデフォルトを指定します。プロット-numberOfRecordsForPlot:するデータが得られるまで、ゼロ (0) を返します。表示するデータを受け取ったら、コントローラーにプロット範囲と軸を更新させ、-reloadDataまたはを使用して表示する新しいデータがあることをプロットに伝え-insertDataAtIndex:numberOfRecords:ます。

于 2013-08-24T12:27:22.310 に答える