0

ビューコントローラーに表示している2つのグラフがあります。y 軸は記録された時間値で、x はデータ、風の凪、突風、平均です。私の問題は、アレイ内のデータ収集が約 8 ~ 10 時間にわたって行われることです。そのため、最初の値が夜の 19:00 になり、最後の値が朝の 05:00 になることがあります。これを散布図に入れようとすると、データは順番ではなく、いたるところにあります。配列のインデックス番号を使用すると、美しくプロットされますが、データが常に時系列であるとは限りません。データのない場所で 1 時間が経過することがあります。y 軸を記録された時間値に変更すると、HH:mm:ss から 19.0 と 5.0 に変換され、前の例では、以下に示すようにプロットが間違っています。カスタム ラベルなどを y 軸に追加しましたが、線形にする方法が必要ですか??

ここに画像の説明を入力

編集:

データに前日と当日がある場合、以下のように実行される軸番号を除いて、x 軸が以下のようになることを望みますか??:

19,20,21,22,23,24,1,2,3,4,5,6

現在、まさにそれを行うための顧客ラベル ループがありますが、データはまだ循環していますか?

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat([xFirstEntry integerValue]) length:CPTDecimalFromFloat(10.5)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat([yMaxValue integerValue]+12)];
plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble([xFirstEntry integerValue]) length:CPTDecimalFromDouble(10.5)];
plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble([yMaxValue doubleValue]*1.23)];


CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue];
x.axisConstraints = [CPTConstraints constraintWithLowerOffset:0];
x.labelingPolicy = CPTAxisLabelingPolicyNone;
xFirstEntry = [[[changedArray objectAtIndex:0]objectForKey:@"date"] substringFromIndex:11];
xFirstEntry = [xFirstEntry substringToIndex:[xFirstEntry length] - 6];
xLastEntry = [[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"] substringFromIndex:11];
xLastEntry = [xLastEntry substringToIndex:[xLastEntry length] - 6];
NSLog(@"%@ %@", xFirstEntry, xLastEntry);
NSMutableArray *xCustomTickLocations = [[NSMutableArray alloc]init];
NSMutableArray *xCustomAxisLabels = [[NSMutableArray alloc]init];
NSInteger newValue = [xFirstEntry integerValue];
if ([xFirstEntry integerValue] > [xLastEntry integerValue]) {
    NSLog(@"gretaer than");
    while (newValue <= 24) {
        [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]];
        [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]];
        newValue++;
    }
    newValue = 1;
    [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]];
    [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]];
    while (newValue <= [xLastEntry integerValue]+1) {
        [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]];
        [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]];
        newValue++;
    }
}
else {
    NSLog(@"less than");
    while (newValue <= [xLastEntry integerValue]+1) {
        [xCustomTickLocations addObject:[NSDecimalNumber numberWithInt:newValue]];
        [xCustomAxisLabels addObject:[NSString stringWithFormat:@"%d",newValue]];
        newValue++;
    }
}
NSUInteger XlabelLocation = 0;
CPTMutableTextStyle *xLabelStyle = [CPTMutableTextStyle textStyle];
xLabelStyle.color = [[CPTColor whiteColor] colorWithAlphaComponent:1];
xLabelStyle.fontName = @"Helvetica-Bold";
xLabelStyle.fontSize = 9.0f;

NSMutableArray *XcustomLabels = [NSMutableArray arrayWithCapacity:[xCustomAxisLabels count]];
for (NSNumber *XtickLocation in xCustomTickLocations) {
    CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [xCustomAxisLabels objectAtIndex:XlabelLocation++] textStyle:xLabelStyle];
    newLabel.tickLocation = [XtickLocation decimalValue];
    newLabel.offset = 2;
    newLabel.rotation=M_PI_2;
   [XcustomLabels addObject:newLabel];
}
x.axisLabels =  [NSSet setWithArray:XcustomLabels];
4

2 に答える 2

1

考えられる解決策はいくつかあります。どちらが最も簡単かは、データの保存方法と、ユーザーがプロットを操作する方法によって異なります。

  1. そのように回り込まないように、線を分割することができます。その日の最後のポイントの後、次の日の最初のポイントの前にあるインデックスに「ダミー」データ ポイントを挿入します。nilまたはを返しNAN、このインデックスのデータ値を改行します。

  2. X 軸を、ある日から次の日に終了する時間スケールとして設定します。Core Plot に組み込まれているフォーマッターの 1 つを使用するか、カスタムの軸ラベルを作成して時間を表示します。

于 2013-11-08T00:05:37.543 に答える
0

以下は、私のソリューションに使用したコードです。

グラフの定義:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormatter setDateFormat:@"yyy-MM-dd HH:mm:ss"];
NSDate *firstDate = [dateFormatter dateFromString:[[changedArray objectAtIndex:0]objectForKey:@"date"]];
NSDate *lastDate = [dateFormatter dateFromString:[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"]];
NSNumber *difference = [NSDecimalNumber numberWithDouble:[lastDate timeIntervalSinceDate:firstDate]];

CPTXYPlotSpace *plotSpace2 = (CPTXYPlotSpace *) graph2.defaultPlotSpace;
plotSpace2.allowsUserInteraction = YES;
plotSpace2.delegate = self;
plotSpace2.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromInteger([difference integerValue]*1.03)];
plotSpace2.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(9)];
plotSpace2.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromInteger([difference integerValue]*1.03)];
plotSpace2.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:CPTDecimalFromFloat(10)];

ラベルと目盛りの位置を作成します。

xFirstEntry = [[[changedArray objectAtIndex:0]objectForKey:@"date"] substringFromIndex:11];
xFirstEntry = [xFirstEntry substringToIndex:[xFirstEntry length] - 6];
xLastEntry = [[[changedArray objectAtIndex:changedArray.count-1]objectForKey:@"date"] substringFromIndex:11];
xLastEntry = [xLastEntry substringToIndex:[xLastEntry length] - 6];

NSMutableArray *x2MajorLocations = [[NSMutableArray alloc]init];
NSMutableArray *x2MinorLocations = [[NSMutableArray alloc]init];
NSMutableArray *x2Labels = [[NSMutableArray alloc]init];
int newValue = [xFirstEntry integerValue];
NSNumber *x2MajorDataPoint = [NSNumber numberWithInt:(newValue)];
NSNumber *x2MinorDataPoint = [NSNumber numberWithInt:(newValue)];
while (newValue <= [xLastEntry integerValue]+1) {
    x2MinorDataPoint = @([x2MajorDataPoint integerValue] + 1800);
    NSNumber *x2LabelValue = [NSNumber numberWithInt:newValue];
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[x2LabelValue stringValue] textStyle:xLabelStyle];
    label.tickLocation = CPTDecimalFromInt([x2MajorDataPoint intValue]);
    label.offset = 4;

    [x2Labels addObject:label];
    [x2MajorLocations addObject:x2MajorDataPoint];
    [x2MinorLocations addObject:x2MinorDataPoint];

    newValue++;
    x2MajorDataPoint = @([x2MajorDataPoint integerValue] + 3600);
}
x2.labelingPolicy = CPTAxisLabelingPolicyNone;
x2.axisLabels = [NSSet setWithArray:x2Labels];
x2.majorTickLocations = [NSSet setWithArray:x2MajorLocations];
x2.minorTickLocations = [NSSet setWithArray:x2MinorLocations];

私の numberForPlot: は連鎖後にどのように見えましたか:

    case CPTScatterPlotFieldX:
        if (index < valueCount) {
            NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
            [formatter setDateFormat:@"yyy-MM-dd HH:mm:ss"];
            NSDate *firstDate = [formatter dateFromString:[[changedArray objectAtIndex:0]objectForKey:@"date"]];
            NSDate *newDate = [formatter dateFromString:[[changedArray objectAtIndex:index]objectForKey:@"date"]];
            return [NSDecimalNumber numberWithDouble:[newDate timeIntervalSinceDate:firstDate]];
       }
        break;

カスタム ラベルを上部に、カスタム ラベルを下部に配置しないと、次のようになります。

ここに画像の説明を入力

于 2013-11-10T04:55:49.900 に答える